计系2复习(2)流程控制,栈帧调用,数据存储

编程入门 行业动态 更新时间:2024-10-08 02:17:33

计系2复习(2)流程控制,栈帧调用,<a href=https://www.elefans.com/category/jswz/34/1770253.html style=数据存储"/>

计系2复习(2)流程控制,栈帧调用,数据存储

目录

  • 流程控制
    • 条件码
      • 设置条件码
      • 访问条件码
      • 条件传送
    • 条件跳转
    • 循环
      • do-while
      • while
      • for
    • switch跳转
  • 栈帧调用
    • 栈帧
    • 调用与返回
    • 参数传递
    • 栈上的局部存储
    • 寄存器保存
  • 数据存储
    • 数组
    • 结构体
      • 对齐
  • 题目
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

流程控制

该章节主要描述x86中汇编代码如何实现流程控制,比如if,switch跳转,或者是for,while循环。

条件码

和LC-3中的nzp条件码类似,x86中的条件码,记录了最后一次运算操作的结果情况。

下面给出常用的条件码列表:

名称全称中文名为1时的意义
CFCarry Flag进位标志最近的操作使最高位产生进位
ZFZero Flag零标志位最近的操作得出的结果为0
SFSign Flag符号标志位最近的操作得到的结果为负数
OFOverflow Flag溢出标志位最近的操作导致一个补码溢出

通过jmp语句及其变式,可以通过判断条件码,来执行对应的跳转。

设置条件码

通过 cmp 和 test 指令可以直接设置条件码,一般用于条件跳转之前,设置对应的跳转条件。

值得注意的是:cmp指令基于 s2 - s1 ,如果有

cmpq S1, S2
jg .L2

那么意思是如果 S2 - S1 > 0 就跳转到 .L2

而test指令常用于判断一个数是否为0,比如

test s1, s1
je .L2

意思是如果s1 & s1 = 0(即s1 = 0),那么跳转到.L2

除此之外,cmp和test操作都只改变条件码,不改变寄存器的值。

访问条件码

通过set系列指令,将条件码加载到某个寄存器的某一字节(全设为0或者1),其他字节不受影响。


这个好像不太常用,略过了

条件传送

条件传送根据条件码的值,如果符合则传送数据到目的寄存器,否则不动。这样也能够间接 实现类似if的跳转


这个好像不太常用,略过了

条件跳转

条件跳转语句(j系列)根据条件码做出不同的跳转。

使用jmp指令可实现无视条件码,进行无条件跳转。而其他的指令需要检验条件码,比如 jg 就是 jump greater,即大于(0)就跳转


跳转语句使用PC+偏移寻址,即下一条指令的起始地址,是通过pc + jump指令的操作数得到的。

比如有如下的汇编代码,可以看到pc+偏移寻址的过程:main调用top,而top调用leaf,通过pc+偏移寻址的过程。

(注意小端表示法,即 f2 ff ff ff 其实是 0xfffffff2)

循环

循环是由条件跳转+判断语句实现的高级逻辑。

do-while

do-while循环先执行body-statement,再判断test-expr,通过测试语句的结果决定是否要进行跳转。

以计算n的阶乘为例,有如下的循环代码:

更多推荐

计系2复习(2)流程控制,栈帧调用,数据存储

本文发布于:2024-02-07 10:49:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756591.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据存储   流程

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!