X86汇编基础
寄存器
x86 有 8 个 32 位通用寄存器,分别是EAX
,EBX
,ECX
,EDX
,ESI
,EDI
,ESP
(stack pointer),EBP
(basic pointer)。
其中EAX
(本段中的 A 均可被 B|C|D替换)这 4 个寄存器可以分段使用。以EAX
为例,其低 2 字节视为 1 个 16 位寄存器AX
,AX
的高低字节分别被视为 2 个 8 位寄存器AH
和AL
。
内存和寻址模式
声明静态数据区
.DATA
可用.data
指令声明数据,通过.byte
, .short
和.long
指明其所占的内存大小,分别是 1 个字节, 2 个字节和 4 个字节。例如:
.data
var :
.byte 64 ;声明一个字节型变量 var, 其所对应的数据是 64.
.byte 10 ;声明一个数据 10, 这个数据没有所谓的 " 标签 ", 其内存地址就是 var+1.
x :
.short 42 ;声明一个大小为 2 个字节的数据, 这个数据有个标签 " x ".
y :
.long 3000 ;声明一个大小为 4 个字节的数据, 这个数据标签是 " y ", 初始化为 3000.
标号
- 用于命名内存地址。
- 按顺序声明的标号会按该顺序存储在内存中。
内存寻址
x86 计算内存地址时,最多可将 2 个 32 位寄存器和 1 个 32 位有符号常量相加,其中的 1 个寄存器可以预先乘 2,4 或者 8。
指令
指令后缀
用于指明数据所占空间大小,有b
,w
,l
,分别表示 1, 2 和 4 个字节。例如:
movb $2, (%ebx) ;将 2 移入到 ebx 中的值所表示的地址单元中.
movw $2, (%ebx) ;将 16 位整数 2 移动到 从 ebx 中的值所表示的地址单元 开始的 2 个字节中.
movl $2, (%ebx) ;将 32 位整数 2 移动到 从 ebx 中的值表示的地址单元 开始的 4 个字节中.
立即数
汇编语言中,立即数总以美元符号$
为前缀,其后有0x
表示该数为 16 进制,无则默认为 10 进制。
Condition
g
即 greater(本以为 great 的比较级和最高级是 better 和 best,没想到竟然是 greater 和 greatest ORZ)。l
即 less。
调用约定
分为调用者约定(caller rules)和被调用者约定(callee rules),即调用和返回过程中操作相关数据必须遵循的步骤。