寄存器、内存操作
一、通用寄存器结构
32 位通用寄存器共有 8 个,每个 32 位寄存器的低 16 位又可作为 16 位寄存器使用。
其中 AX、CX、DX、BX 这四个 16 位寄存器,还能进一步拆分成两个 8 位寄存器(高 8 位和低 8 位)。
| 寄存器 | 编号(二进制) | 编号(十进制) | ||
|---|---|---|---|---|
| 32位 | 16位 | 8位 | ||
| EAX | AX | AL | 000 | 0 |
| ECX | CX | CL | 001 | 1 |
| EDX | DX | DL | 010 | 2 |
| EBX | BX | BL | 011 | 3 |
| ESP | SP | AH | 100 | 4 |
| EBP | BP | CH | 101 | 5 |
| ESI | SI | DH | 110 | 6 |
| EDI | DI | BH | 111 | 7 |
结构关系示意图:
|
→ |
|
|
|||||||||||||||||||||||||||||||||||||||||||||||
二、MOV 指令详解
格式:MOV 目标操作数, 源操作数
作用:将源操作数的值拷贝到目标操作数。
所有合法形式(r = 通用寄存器,m = 内存单元,imm = 立即数):
1 | MOV r/m8, r8 |
使用规则:
- 源操作数可以是立即数、通用寄存器、段寄存器、内存单元。
- 目标操作数可以是通用寄存器、段寄存器、内存单元。
- 两个操作数的宽度必须一致。
- 源操作数和目标操作数不能同时为内存单元。
三、常用运算指令语法
以下列出 ADD、SUB、AND、OR、XOR、NOT 所有合法形式,练习时务必逐条在调试器中验证。
ADD(加法):
1 | ADD AL, imm8 |
SUB(减法):
1 | SUB AL, imm8 |
AND(与):
1 | AND AL, imm8 |
OR(或):
1 | OR AL, imm8 |
XOR(异或):
1 | XOR AL, imm8 |
NOT(取反):
1 | NOT r/m8 |
四、内存基础
1. 寄存器与内存的区别
- 寄存器:位于 CPU 内部,数量少,执行速度快,价格昂贵。
- 内存:位于主板,速度相对较慢,成本低,容量大。
- 本质相同:都是定宽的、用于存储 0/1 数据的容器。
- 常用寄存器:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI(均为 32 位)。
2. 计量单位
1 | BYTE 字节 = 8 bits |
3. 内存编号与寻址
- 内存单元数量巨大,无法逐一命名,因此用 编号(地址) 标识。
- 每个编号对应 1 个字节(8 bits)的内存空间。
- CPU 是 32 位或 64 位,指的是 地址编号的宽度,而非寄存器的宽度。
- 32 位地址总线能表示的范围:
0x00000000~0xFFFFFFFF,共0xFFFFFFFF + 1 = 4 GB。
1 | 内存编号示意图: |
4. 内存读写语法
关键点:
- 用
[ ]表示地址(区别于立即数)。 - 必须指定读写宽度:
byte(1字节)、word(2字节)、dword(4字节)。 ptr指明后面是一个地址(指针)。ds是段寄存器前缀(现阶段固定写法,暂不深究)。- 练习时地址建议使用 ESP 指向的栈区域,不要随意指定(部分内存受保护,不可直接读写)。
写入内存:
1 | MOV DWORD PTR DS:[0x0012FFC4], 0x12345678 |
读取内存到寄存器:
1 | MOV EAX, DWORD PTR DS:[0x0012FFD0] |
其他宽度示例:
1 | MOV BYTE PTR DS:[0x0012FFC4], 0xAB ; 写 1 字节 |
五、课后作业
练习目的:深刻理解寄存器、内存单元与数据宽度。
- MOV 指令全部形式
- ADD、SUB、AND、OR、XOR 指令全部形式
- NOT 指令全部形式
提示:地址选择 ESP 附近的值以避免访问违规。