数据存储"/>
计系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时的意义 |
---|---|---|---|
CF | Carry Flag | 进位标志 | 最近的操作使最高位产生进位 |
ZF | Zero Flag | 零标志位 | 最近的操作得出的结果为0 |
SF | Sign Flag | 符号标志位 | 最近的操作得到的结果为负数 |
OF | Overflow 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)流程控制,栈帧调用,数据存储
发布评论