BY eHWRITTEN ON HALO3 MIN READ
8086默认寄存器
在 8086 和 x86 汇编中,有很多“默认规则”(隐含操作寄存器),这些都是 CPU 设计时固定好的,程序员无法改变。以下是你应该掌握的一些典型例子: 🔸 一、乘法和除法指令(默认寄存器) 指令 操作数 默认被乘数/被除数 结果 备注 mul r8 8位寄存器,如 bl AL × r8 A

在 8086 和 x86 汇编中,有很多“默认规则”(隐含操作寄存器),这些都是 CPU 设计时固定好的,程序员无法改变。以下是你应该掌握的一些典型例子:
🔸 一、乘法和除法指令(默认寄存器)
| 指令 | 操作数 | 默认被乘数/被除数 | 结果 | 备注 |
|---|---|---|---|---|
mul r8 |
8位寄存器,如 bl |
AL × r8 |
AX |
无符号乘法 |
mul r16 |
16位寄存器,如 bx |
AX × r16 |
DX:AX |
无符号乘法 |
imul r16 |
同上 | 同上 | 同上 | 有符号乘法 |
div r8 |
除数是 r8,被除数是 AX |
AX ÷ r8 |
商 → AL,余数 → AH |
无符号除法 |
div r16 |
除数是 r16,被除数是 DX:AX |
DX:AX ÷ r16 |
商 → AX,余数 → DX |
无符号除法 |
🔸 二、字符串处理指令(默认用 SI、DI、CX)
| 指令 | 默认寄存器 | 功能 |
|---|---|---|
movsb |
SI→源,DI→目标 |
复制字符串(字节) |
stosb |
DI→目标,AL→源 |
把 AL 写入目标 |
lodsb |
SI→源,读取到 AL |
从内存读取一个字节到 AL |
scasb |
AL 与 DI 指向的内容比较 |
字符串比较 |
rep movsb |
CX 控制复制次数 |
复制 CX 个字节 |
这些操作都是围绕 DS:SI 和 ES:DI 展开的。
🔸 三、栈操作(默认寄存器)
| 指令 | 默认行为 |
|---|---|
push r16 |
SP = SP - 2,将 r16 入栈 |
pop r16 |
从栈顶读 2 字节给 r16,SP = SP + 2 |
call |
自动将返回地址 IP 入栈 |
ret |
从栈中弹出返回地址 |
这些都使用 SS:SP 作为栈指针。
🔸 四、输入输出指令(默认寄存器)
| 指令 | 默认端口寄存器 | 数据寄存器 |
|---|---|---|
in al, dx |
DX 指定 I/O 端口地址 |
数据读入 AL |
out dx, al |
DX 指定 I/O 端口地址 |
数据从 AL 写出 |
也就是说,端口地址是放在 DX 里的,数据寄存器是 AL(或 AX)。
🔸 五、段寄存器默认配对规则(隐式段寄存器)
| 操作 | 默认段寄存器 |
|---|---|
mov ax, [bx] |
DS:[BX] |
mov [si], ax |
DS:[SI] |
mov ax, [bp] |
SS:[BP] ⚠️ 特例! |
stosb、movsb |
源:DS:SI,目标:ES:DI |
如果你不手动指定段寄存器,比如 mov ax, ds:[bx],CPU就会用默认规则。
1