# 汇编
# 汇编指令
在 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+ | 从右向左压入栈中 |