指令后缀
AT&T格式的汇编指令有不同的后缀
 其中
 b表示byte,字节
 w表示word,字/两字节
 l表示long,32位系统下的long是4字节
 q表示quad,意味四重,表示4个字/8字节
寄存器用途
参见
 AT&T的汇编世界 - Gemfield的文章 - 知乎
特殊寻址方式
指针寄存器rsp可以用-8(%rsp)这种方式来寻址,rax等寄存器则不能
 想寻址的偏移量保存在寄存器里:
 (%rsp, %rax)       # 偏移rax寄存器里保存的值
 %rsp, %rax, 2)    # 取rsp偏移rax2处的值,上行实际上是缺省了1
 2(%rsp, %rax, 2) # 取rsp偏移rax2+2处的值
 如下图所示
 
 通过gdb调试查看,符合
 
命令行参数
在bash中执行命令时,参数的数量保存在(%rsp)寄存器处;
 第0个参数的地址(可执行文件名)保存在8(%rsp)处
 第1个参数的地址保存在16(%rsp)处
 … …
 后面是环境变量
GDB汇编调试简介
layout asm 显示汇编源码
 si 单步执行汇编指令,会进入函数
 ni 单行执行汇编指令,不会进入函数
 i r(info regirester) 查看寄存器的值
 p 打印变量的值
 p $rax # 打印rax寄存器的数据
 p *0xaaaa # 打印0xaaaa处的数据,以十进制整数形式
 p (char*)0xaaaa # 以字符串形式
x 打印地址内的数据
 x $rsp # 打印rsp寄存器指向地址内保存的数据
 x/[数量][格式][宽度]
 数量:打印多少字节
 格式:t二进制/o八进制/d十进制/x十六进制/c字符/f浮点
 宽度:b字节/h两字节/w四字节/g八字节
 例:x/20xg $rsp,打印rsp到rsp+20处的指向地址内保存的数据
语法杂记
div
 div指令不接受一个立即数作为参数
 div执行前被除数的高位放在rdx、低位放在rax,执行后的商放在rax、余数放在rdx,因此要连续运算,需要把高位rdx清零或是重新赋值
lea
 lea指令的源操作数不能是数据寄存器,因此如果想把一个常量的地址加载到某处
 movq $1234, %rax
 leaq %rax, %rdi
 上述做法是错误的
 一般需要用栈空间中转,用法如下
 movq $1234, -8(%rsp)
 leaq -8(%rsp), %di
 (使用栈空间需要先分配