更新于20190929
1. Intel和AT&T汇编
参数是反的,AT&T寄存器前加%,常量前加$
Intel
mov rax, rcx ;rcx -> rax
mov cl, 2
对应AT&T
movq %rcx, %rax ;rcx -> rax
mov $2, %cl
后文中如无特殊说明,都是Intel格式
2. 寄存器
64位系统下能用的通用寄存器如下图:
区别有:
- 64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。
- 32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值
- 64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用
- 64位支持一些形式的以PC相关的寻址,而32位只有在jmp的时候才会用到这种寻址方式。 </