Fork me on GitHub

CSAPP-5

代码

机器代码

  • 程序计数器(PC)%rip给出将要执行的下一条指令在内存中的地址

  • 整数寄存器文件包含16个命名的位置,储存地址或者整数数据。

  • 条件码寄存器保存最近执行的算术或逻辑指令的状态信息。实现控制或数据流中的条件变化。

  • 一组向量寄存器可以存放一个或多个整数或浮点数值

  • 虚拟地址(64位)的高十六位必须设置为0

  • 查看汇编代码(—>test.s)

    1
    linux> gcc -Og -S test.c
  • 编译并汇编该代码(—>test.o)

    1
    linux> gcc -Og -c test.c
  • GCC产生的汇编代码指令上有后缀,而反汇编代码没有,x86-64的内存引用都是四字长寄存器给出。

  • 反汇编器:根据机器代码生成一种类似于汇编代码的格式。

    查看机器代码文件的内容:

1
linux> objdump -d matore.o

访问信息

整数寄存器:

操作数指示符

立即数:常数 ($(C常数表示法))

寄存器:某个寄存器的内容

内存引用:根据计算出的地址,访问地址

数据传送指令

MOV类:把数据从源位置复制到目的位置

源操作数是一个储存在寄存器或者内存中的立即数

目的操作数是个寄存器或者内存地址(位置),不能是立即数寻址

x86-64:两操作数不能都指向内存位置。

指令 描述
movb(8) 传送字节
movw(16) 传送字
movl(32) 传送双字,以寄存器为目的时,把寄存器高位4字节设置为0
movq(64) 传送四字
movabsq 传送绝对的四字

字节传送指令比较(16进制)

指令 描述
movb 不改变其他字节
movsbq 把其他字节设为FF
movzbq 把其他字节设为00

压入和弹出栈数据

pushq:把数据压入到栈上

popq:弹出数据

%rsp:栈指针,保存栈顶元素地址

压入四字节:先减去8(栈倒过来放),然后将值写入新的栈顶地址。

1
2
subq $8,%rsp
movq %rbp,(%rsp)

弹出四字节:读出数据,加上8

1
2
movq(%rsp),%rax
addq $8,%rsp
0%