i386 架构基础
i386 通常指 32 位 x86 指令集环境。它保留分段模型,但现代平坦内存模型中代码、数据与栈段通常映射到相同线性地址空间。
通用寄存器
| 寄存器 | 常见职责 |
|---|---|
EAX | 算术、函数返回值 |
EBX | 通用基址寄存器 |
ECX | 计数、移位次数 |
EDX | 扩展算术、I/O |
ESI / EDI | 源与目标索引 |
ESP | 栈顶指针 |
EBP | 栈帧基址 |
EIP | 下一条指令地址 |
AX 是 EAX 的低 16 位,AH 和 AL 又分别是 AX 的高、低 8 位。
段寄存器与标志
CS:EIP指向当前代码位置。SS:ESP描述当前栈位置。DS、ES常用于数据访问;FS、GS也可承载线程局部数据。EFLAGS中的ZF、CF、SF、OF分别表示零、进位、符号和有符号溢出。
段寄存器不能像普通寄存器一样任意参与算术。修改 CS 通常通过远跳转、调用或返回完成。
栈帧示例
asm
push ebp
mov ebp, esp
sub esp, 16
; ... 使用 [ebp-4] 等位置保存局部变量
mov esp, ebp
pop ebp
ret经典 32 位 cdecl 约定中,参数由调用者从右到左压栈,返回值位于 EAX,调用者负责恢复参数占用的栈空间。编译器启用优化后可能省略 EBP 栈帧,因此不要把示例序言当成固定规则。
寻址形式
有效地址可写成 base + index * scale + displacement:
asm
mov eax, [ebx + ecx*4 + 8]比例只能是 1、2、4、8。这种形式非常适合访问数组和结构体字段。
