escape.cloop.csum_array.ctest_func.cx86-64-reference.pdfLecture12.pdf

Assembly Execution and %rip

image.png

Register Responsibilities

image.png

Instructions Are Just Bytes!

image.png
在主存 main memory中:
image.png

%rip

image.png
程序计数器program counter在x86-64中称为%rip,存放着下一条要被执行的指令的地址。
image.png
image.png
image.png
image.png
image.png

jmp

image.png

Control Flow Mechanics 控制流

image.png

Conditional Jumps 条件跳转指令汇总

image.png
image.png

Condition Codes 条件码

image.png
可以看到x86-64的状态寄存器叫eflags。
image.png
image.png

Setting Condition Codes 设置条件码

用cmp指令或者test指令来设置。
image.png
image.png

image.png
Test命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。
image.png

If statements

image.png
image.png

Loops 汇编循环

While loops

image.png

For loops

image.png
image.png

gdb tips

image.png
image.png

Other Instructions That Depend On Condition Codes

set: Read condition codes set指令

image.png
x装在edi中,读取flags的值,如果%edi小于等于15,就将%al置1,否则置0,然后清零%rax的高32位,返回。
image.png

cmov: Conditional move cmov指令

image.png
image.png
image.png
如果是负数则 (x + 3) >> 2,如果非负则 x >> 2,都是算术右移,带符号。

Live Session Slides

image.png

Remember test exists

image.png
image.png

Practice: “Escape Room”

image.png
image.png

  1. // escape_room.c
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. bool escape_room(int x) {
  5. if (2 * x > 5) {
  6. return true;
  7. }
  8. if (x == 1) {
  9. return true;
  10. }
  11. return false;
  12. }
  13. int main() {
  14. printf("escape room %d\n", escape_room(4));
  15. return 0;
  16. }