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种方式

  1. set指令. 根据条件码将一个字节设置为0或者1.

  2. jmp指令. 根据条件码跳转.

  3. cmov指令. 根据条件码赋值, 又叫条件传送.

C语言提供了多种循环结构, do-while, while, for. 汇编中没有这些指令, 可以用条件测试和跳转组合实现循环的效果.

switch语句可以通过使用跳转表(jump table)来实现的更加高效.

函数调用子函数

函数P调用子函数Q, 可能有以下操作

  1. 保存后面可能会用到的"调用者保存寄存器"到内存
  2. 为Q生成一个新的栈帧, 将栈帧P的地址保存到栈帧Q的底部
  3. 调用Q
  4. 函数Q保存可能会用到的"被调用者保存寄存器"到内存
  5. 获取传递过来的参数进行运算, 参数可能通过寄存器传递(最多6个), 也可能通过栈中内存地址进行传递
  6. 从内存恢复"被调用者保存寄存器"到指定寄存器
  7. 返回, 销毁函数Q的栈帧, 当前栈帧指向P
  8. 从内存恢复"调用者保存寄存器"到指定寄存器
  9. 继续后续的动作
原文地址:https://www.cnblogs.com/winwink/p/CSAPP_Note_Chapter3_Machine_part2.html