程序的机器级表示(上)

C语言代码的汇编级别表示

mstore.c

1
2
3
4
5
6
long (long, long);

void mulstore(long x, long y, long *dest) {
long t = mult2(x, y);
*dest = t;
}

通过gcc -Og -S mstore.c命令生成如下汇编代码

1
2
3
4
5
6
7
mulstore:
pushq %rbx
movq %rdx, %rbx
call mult2
movq %rax, (%rbx)
popq %rbx
ret

通过gcc -Og -c mstore.c产生mstore.o文件,通过objdump -d mstore.o查看该文件

1
2
3
4
5
6
7
0000000000000000 <mulstore>:
0: 53 push %rbx
1: 48 89 d3 mov %rdx,%rbx
4: e8 00 00 00 00 callq 9 <mulstore+0x9>
9: 48 89 03 mov %rax,(%rbx)
c: 5b pop %rbx
d: c3 retq

数据格式

img

访问信息

一个x86-64的CPU包含一组16个存储64位值的通用目的寄存器,这些寄存器用来存储整数数据和指针。

img

操作数指示符

操作数分为3种类型:

  1. 立即数:$-577,$0x1F
  2. 寄存器:%bp,%rax
  3. 内存引用:(%rax)

数据传送指令

数据传送指令是将数据从一个位置复制到另一个位置。

源操作数指定的值一定是一个立即数,存储在寄存器中或者内存中。

目的操作数指定一个位置,要么是一个寄存器,要么是一个内存地址。

传送指令的两个操作数不能都指向内存位置。

img

操作数
%rax 0x100
0x104 0xAB
$0x108 0x108
(%rax) 0xFF
4(%rax) 0xAB
9(%rax, %rdx) 0x11
260(%rcx, %rdx) 0x13
0xFC(, %rcx, 4) 0xFF
(%rax, %rdx, 4) 0x11

例题:

1
2
3
movb $0xF, (%ebx) //%ebx不能作为地址寄存器
movl %rax, (%rsp) // 应为movq
movw (%rax), 4(%rsp) //地址到地址

img

系统