X86-64汇编,寄存器,栈帧杂记

正文

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栈帧原理
x86-64 官方说明

posted @ 2021-01-20 10:18  woder  阅读(585)  评论(0编辑  收藏  举报