
段地址、批量传送与有符号数运算
1. 内存寻址与变址寄存器(索引寻址) 寻址寄存器限制 :8086处理器中,只有 BX 、 SI 、 DI 、 BP 可用于提供内存偏移地址。 基址+变址寻址 : 合法组合 :必须是一个基址寄存器(BX/BP)加一个变址寄存器(SI/DI)。 bx+si
1. 内存寻址与变址寄存器(索引寻址)
- 寻址寄存器限制:8086处理器中,只有
BX、SI、DI、BP可用于提供内存偏移地址。 - 基址+变址寻址:
-
合法组合:必须是一个基址寄存器(BX/BP)加一个变址寄存器(SI/DI)。
-
[bx+si],[bx+di],[bp+si],[bp+di](合法) -
[bx+ax],[dx+si](非法)
-
-
应用场景:常用于遍历数组或多位数值。例如
mov al, [bx+si],其中 BX 指向起始地址,SI 作为索引递增/递减。
-
2. 算术指令的逻辑
-
减法指令
sub:处理器内部通常没有独立的减法电路,sub ah, al实际上等同于neg al(求补码) 然后add ah, al。 -
除法指令:div 与 idiv:
div:无符号数除法(Unsigned Divide)。idiv:有符号数除法(Signed Divide)。
-
重要前置操作
cwd:在执行 16 位有符号除法前,必须用cwd指令将AX的符号扩展到DX,形成DX:AX。如果不执行这一步,高位DX的随机值会导致除法溢出或结果错误。
3. 核心标志位详解
处理器执行指令时不区分有符号或无符号,它只是更新标志位,由程序员决定看哪个标志:
| 标志位 | 全称 | 判定逻辑 | 适用场景 |
|---|---|---|---|
| CF | Carry Flag | 最高位是否有进位或借位 | 无符号数溢出 |
| OF | Overflow Flag | 结果是否超出了有符号数能表示的范围 | 有符号数溢出 |
| ZF | Zero Flag | 结果是否为 0 | 循环控制、相等判断 |
| SF | Sign Flag | 结果的最高位是否为 1(即结果是否为负) | 有符号正负判断 |
| PF | Parity Flag | 结果最低 8 位中“1”的个数是否为偶数 | 通信奇偶校验 |
- 特殊规则:
inc和dec指令不影响 CF(进位标志),但会影响 ZF、SF、OF。
4. 比较与条件转移指令(jcc)
cmp指令:执行减法操作,但不保存结果,仅更新标志位。- 条件跳转(依赖标志位状态):
常用跳转指令表
| 指令 | 英文含义 | 跳转条件 | 解释 |
|---|---|---|---|
| jz / je | Jump Zero / Equal | ZF=1 | 结果为0或相等 |
| jnz / jne | Jump Not Zero | ZF=0 | 结果不为0或不等 |
| js / jns | Jump Sign / Not Sign | SF=1 / SF=0 | 结果为负 / 结果为正 |
| jo / jno | Jump Overflow | OF=1 / OF=0 | 有符号溢出 / 未溢出 |
| jc / jnc | Jump Carry | CF=1 / CF=0 | 无符号溢出(借位) / 未溢出 |
比较跳转(专门区分有/无符号)
- 无符号数(Above/Below):
ja(高于),jae(高于等于),jb(低于),jbe(低于等于)。 - 有符号数(Greater/Less):
jg(大于),jge(大于等于),jl(小于),jle(小于等于)。
5. NASM 编译器特殊符号
$:表示当前行在当前段内的汇编地址。$$:表示当前段的起始汇编地址。jmp near $:死循环。因为$代表当前指令地址,所以它会无限跳转回自己。- 程序填充逻辑:
times 510-($-$$) db 0用于计算当前代码到 510 字节处的距离并填充 0,常用于制作 MBR(512字节)。
6. 数据显示与 ASCII 转换
- 数值转 ASCII:计算出的单个数字(0-9)必须加上 0x30(即字符 '0' 的编码)才能在屏幕上正确显示。
- 低端字节序:在 16 位传送(如
movsw)到显存时,低字节存入偏移地址处(字符),高字节存入偏移地址+1处(属性)。