段地址、批量传送与有符号数运算

1. 内存寻址与变址寄存器(索引寻址) 寻址寄存器限制 :8086处理器中,只有 BX 、 SI 、 DI 、 BP 可用于提供内存偏移地址。 基址+变址寻址 : 合法组合 :必须是一个基址寄存器(BX/BP)加一个变址寄存器(SI/DI)。 bx+si

1. 内存寻址与变址寄存器(索引寻址)

  • 寻址寄存器限制:8086处理器中,只有 BXSIDIBP 可用于提供内存偏移地址。
  • 基址+变址寻址
    • 合法组合:必须是一个基址寄存器(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. 核心标志位详解

处理器执行指令时不区分有符号或无符号,它只是更新标志位,由程序员决定看哪个标志:

标志位全称判定逻辑适用场景
CFCarry Flag最高位是否有进位或借位无符号数溢出
OFOverflow Flag结果是否超出了有符号数能表示的范围有符号数溢出
ZFZero Flag结果是否为 0循环控制、相等判断
SFSign Flag结果的最高位是否为 1(即结果是否为负)有符号正负判断
PFParity Flag结果最低 8 位中“1”的个数是否为偶数通信奇偶校验
  • 特殊规则incdec 指令不影响 CF(进位标志),但会影响 ZF、SF、OF。

4. 比较与条件转移指令(jcc)

  • cmp 指令:执行减法操作,但不保存结果,仅更新标志位。
  • 条件跳转(依赖标志位状态)

常用跳转指令表

指令英文含义跳转条件解释
jz / jeJump Zero / EqualZF=1结果为0或相等
jnz / jneJump Not ZeroZF=0结果不为0或不等
js / jnsJump Sign / Not SignSF=1 / SF=0结果为负 / 结果为正
jo / jnoJump OverflowOF=1 / OF=0有符号溢出 / 未溢出
jc / jncJump CarryCF=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处(属性)。