# 汇编

# 汇编指令

在 Linux 上,大部分双操作数的指令均已前者为目的操作数,后者为源操作数。

# 间接寻址

**[] ** 表示间接寻址,类似 c 语言的 ***** .

mov eax, [ebx+8]	;若ebx储存值为0x4008,则该指令将0x4010处的值赋给eax
mov eax, [0x4001]	;将地址0x4001处的值赋给eax(该代码为推测,不一定合法)
lea eax, [ebx]	;直接将ebx的值赋值给eax

# 常用命令

push 将数据入栈,pop 将栈顶数据弹出

push eip	;将eip储存的值入栈
pop eip		;将栈顶数据弹出并存入eip

mov 传送字节,相当于赋值语句。

lea 装入有效地址,相当于取地址。

mov eax, ebx	;将ebx的值赋给eax
mov ecx, 0Ah	;将ecx赋值为0x0A

lea eax, [ebp+buf]	;将局部变量buf的地址存入eax

call 调用函数。jmp 跳转指令。

call __printf	;跳转printf函数
				;call相当于入栈当前eip后执行jmp
push eip
jmp __printf

inc 将目标操作数自增 1

dec 将目标操作数自减 1

# 比较和跳转

# 寄存器

# 通用寄存器

# 指针寄存器

32 位 64 位 名称 备注
EBP RBP 基址指针寄存器 (extended base pointer) 指向栈帧的底部
ESP RSP 栈指针寄存器 (extended stack pointer) 指向栈帧的顶部
ESI RSI 源变址寄存器 (Source Index) 字符串操作源指针
EDI RDI 目的指针寄存器 (Destination Index) 字符串操作目标指针

# 数据寄存器

数据寄存器主要用来保存操作数和运算结果等信息。

在 64 位系统下,32 位寄存器代表对应 64 位寄存器的低 32 位。例如 eax 为 rax 的低 32 位。修改 eax 不影响 rax 高位部分。16 位寄存器同理。

此外,16 位寄存器可分为 2 个 8 位寄存器。(AX: ah~al; BX: bh~bl; CX: ch~cl; DX: dh~dl) 分别表示高 8 位和低 8 位。

32 位 64 位 16 位 名称 备注
EAX RAX AX 累加寄存器 (Accumulator) 在乘法和除法指令中被自动使用;在 Win32 中,一般用在函数的返回值中。
EBX RBX BX 基址寄存器 (Base) DS 段中的数据指针
ECX RCX CX 计数寄存器 (Count) CPU 自动使用 ECX 作为循环计数器,在字符串和循环操作中常用,在循环指令(LOOP)或串操作中,ECX 用来进行循环计数,每执行一次循环,ECX 都会被 CPU 自动减一
EDX RDX DX 数据寄存器 (Data)
寄存器

# 指令寄存器

32 位 64 位 名称 备注
EIP RIP 指令指针寄存器 (Instruction Pointer) 保存着下一条要执行的指令的地址。

# 段寄存器

寄存器 解释
CS 代码段 (Code Segment)
DS 数据段 (Data Segment)
SS 堆栈段 (Stack Segment)
ES 附加数据段 (Extra Segment)
FS 附加数据段
GS 附加数据段

# 标志寄存器

# 条件标志寄存器

寄存器 解释 备注
OF 溢出标志位 (OverFlow Flag) 用来反应有符号数加减法运算所得结果是否溢出。运算超出当前运算位数所能表示的范围,则称为溢出,标志位被置为 1,否则为 0。
SF 符号标志位 (Sign Flag) 用来反应运算结果是否为 0。运算结果为负时置为 1,否则为 0。
ZF 零标志位 (Zero Flag) 用来反应运算结果是否为 0。为零时置为 1,否则为 0。
AF 辅助进位标志位 (Auxilliary carry Flag) 在字操作址,发生低字节向高字节进位或借位时该标志位被置为 1,否则为 0。
PF 奇偶标志位 (Parity Flag) 用于反应结果中 “1” 的个数的奇偶性。如果 “1” 为偶数置为 1,否则为 0。
CF 进位标志位 (Carry Flag) 运算结果的最高位产生了一个进位或错位,则该标志位置为 1,否则为 0。

# 控制控制寄存器

寄存器 解释 备注
DF 方向标志位 (Direction Flag) 用于串操作指令中,控制地址的变化方向。当 DF 为 0 时,存储器地址自动增加;当 DF 为 1 时,存储器地址自动减少。
IF 中断标志位 (Interrupt Flag) 用于控制外部可屏蔽中断是否可以被处理器响应。[^1]
TF 陷阱标志位 (Trap Flag) 用于控制处理器是否进入单步操作方式。当 TF 为 0 时,处理器在正常模式下运行;当为 1 时,处理器单步执行指令,调试器可以逐步指令进行执行就是使用了该标志位。

# 特殊:64 位调用函数传参

参数 寄存器
1 rdi
2 rsi
3 rdx
4 rcx
5 r8
6 r9
7+ 从右向左压入栈中