转载至知乎 https://zhuanlan.zhihu.com/p/64914472

汇编语言论风格来分主要是两类,一类是Intel汇编,一类是AT&T汇编,分别被Windows和Linux作为主流风格。在这篇文章中使用ATT汇编。
简单说一下AT&T汇编,"#"井号开头的是注释行,"."点开始的指令一般都是伪指令,"$"美元符号修饰立即数,"%"修饰寄存器。例如:

.section .data //表示数据段的开始
movl $1, %ebx //表示把数字1写入ebx寄存器。
movl 0xFFFF0000, %eax 表示把0xFFFF0000地址处的32位数写入eax寄存器。

寻址方式
内存地址的引用格式:

地址或偏移(%基址或偏移量寄存器, %索引寄存器, 比例因子)

这一串东西基本上都是可选的,没写的项基本上算以0代替,不同的组合就成了不同的寻址方式,如下:
1、直接寻址

movl ADDRESS, %eax

ADDRESS其实就相当于"地址或偏移"里的地址,反正就是一个数字。
2、寄存器寻址
其实上面的例子也包括了寄存器寻址,顾名思义%eax就是寄存器寻址,代表对这个寄存器本身的写入或读出。
3、立即寻址

movl $2, %ebx

4、间接寻址

movl (%eax), %ebx

(%eax)就是间接寻址了,意思就是访问eax寄存器里的数值所代表的地址。相当于通用公式里的%基址或偏移量寄存器。
5、索引寻址(变址寻址)

movl 0xFFFF0000(,%eax,4), %ebx

4(%eax)就是基址寻址,意思是以eax寄存器里的数值作为基址,加上4得到最终地址。也可以匹配到上面的通用公式,而且这个是很常用的寻址方式。