CSAPP笔记(第三章 程序的机器级表示)-02
第三章的内容为p145~p252, 分3次. 本篇为第2次, p171~p211.
摘要
本篇主要讲了条件寄存器和函数调用子函数.
条件寄存器
CMP指令, cmp S1,S2 => IF(S2 - S1)
, cmpb, cmpw, cmpl, cmpq.
Test指令, test S1,S2 => IF(S1 & S2)
, testb, testw, testl, testq.
条件码的使用
3种方式
-
set指令. 根据条件码将一个字节设置为0或者1.
-
jmp指令. 根据条件码跳转.
-
cmov指令. 根据条件码赋值, 又叫条件传送.
C语言提供了多种循环结构, do-while, while, for. 汇编中没有这些指令, 可以用条件测试和跳转组合实现循环的效果.
switch语句可以通过使用跳转表(jump table)来实现的更加高效.
函数调用子函数
函数P调用子函数Q, 可能有以下操作
- 保存后面可能会用到的"调用者保存寄存器"到内存
- 为Q生成一个新的栈帧, 将栈帧P的地址保存到栈帧Q的底部
- 调用Q
- 函数Q保存可能会用到的"被调用者保存寄存器"到内存
- 获取传递过来的参数进行运算, 参数可能通过寄存器传递(最多6个), 也可能通过栈中内存地址进行传递
- 从内存恢复"被调用者保存寄存器"到指定寄存器
- 返回, 销毁函数Q的栈帧, 当前栈帧指向P
- 从内存恢复"调用者保存寄存器"到指定寄存器
- 继续后续的动作