正文
Intel汇编与At&t汇编区别
AT&T的立即数前面有修饰符号$. e.g. $4
Intel的立即数不需要修饰 e.g. 4
AT&T寄存器名称前有修饰符号% e.g. movl $4, %eax
Intel寄存器名称不需要修饰 e.g. mov eax, 4
AT&T的源操作数在左边,目的操作数在右边 命令表示为 opt src to dst
e.g. movl $4, %eax
Intel的目的操作数在左边,源操作数在右边 命令表示为 opt dst from src
e.g. mov eax, 4
AT&T的命令字有数据长度修饰符号
e.g. movl %ebx, 4
Intel的命令字没有修饰符号,而是提供了单独的命令字或在操作数中给定数据长度
e.g. mov eax, dword ptr val_to_eax
AT&T跳转时,将段和偏移当作不同的操作数
e.g. ljmp $segment, $offset
Intel语法将段和偏移当成一个操作数
e.g. jmp segment:offset
1.mov
mov的原型
mov dest source
mov通过[]访问内存与地址, []和c一样表示,取eax地址对应的空间
mov [eax], rbx
对于一些八位的内存空间地址的大小,可以使用类似QWORD PTR的标识符标志出来
mov QWORD PTR [eax], rbx
如果要使用段寄存器,在括号外使用:标志段偏移,如下,表示的是将rbx的值放到[fs + eax]对应空间
mov QWORD PTR fs:[eax], rbx
2.intel汇编的参数寄存器传递
参数传递会使用六个寄存器:
%rdi
%rsi
%rdx
%rcx
%r8
%r9
返回值寄存器: %rax
3.段寄存器
cs: 代码段寄存器
ds: 数据段寄存器
ss: 堆栈段寄存器
es: 扩展段寄存器
fs: 标志段寄存器
gs: 全局段寄存器
4.test %rax %rax
用来判断 %rax是否为0,test指令本来是让后面两个数做AND操作,然后根据结果去设置ZF位的,如果%rax的值为0,那么zs这个的标志就为1,
5.函数栈帧调用过程
其中关于%esp的值,指向的是当前正在使用的地址而不是下一个未使用的地址,但是注意到栈是从顶往下的,%esp指向的是使用的内存空间的低地址
ref
https://blog.csdn.net/u013737447/article/details/49154509
x86 寄存器: https://www.cnblogs.com/tongyishu/p/11679829.html
第4部分-Linux x86 64位汇编Intel汇编语法三
x86通用寄存器
x86栈帧原理