Contents

8086 寄存器、指令笔记

8086 寄存器分类

所有寄存器均为 16 位,其中 AX、BX、CX、DX 分别可以分成两个 8 位的寄存器使用,比如 AH, AL 分别表示 AX 的高 8 位和低 8 位。

通用:

  • AX, BX, CX, DX
  • SP, BP
  • SI, DI

专用:

  • IP
  • PSW
  • CS, DS, SS, FS

8086 指令分类

  • 运算类
    • 算数运算: add, sub…
    • 逻辑运算: and, or…
    • 移位运算: shr, shl…
  • 传送类
    • 单传送: mov, push…
    • 串传送: movsb
    • I/O 传送:int, out
  • 跳转类
    • 直接跳转:jmp
    • 间接跳转:call、ret、iret、loop, int…
  • 修改标志位类:sti, cli…

标记寄存器标记位意义

高四位和低六位中的三个奇数位未用上。

—-ODITSZ-A-P-C

  • C(Carry):进、借位标志,有则为 1,反之为 0;只对无符号运算有意义(inc, dec 指令不影响)
  • P(Parity):奇偶标志,运算结果里 1 的个数,偶数个位 1,反之为 0(运算类的指令都会影响)
  • A(Auxiliary carry):运算时最低半字节是否有进、借位,有则为 1,反之为 0,只要是处理器内部使用
  • Z(Zero):运算结果是否为 0 的标志,是则为 1,反之位 0(运算类的指令都会影响)
  • S(Sign):运算的结果是否为负,是则为 1,反之位 0,只对有符号运算有意义(运算类的指令都会影响)
  • T(Trap):陷阱标志,用于标识 CPU 是否允许单步中断,是则为 1,反之则为 0
  • I(Interrupt):是否允许可屏蔽中断,为 1 允许,反之不允许,通过 cli, sti 设置,前者设置为 0,后者设置为 1
  • D(Direction):movsb 串处理指令的方向标志,通过 cld, std 指令赋值,前者赋为 0,后者赋为 1;取 0 时每次传送 si, di 自增 1,反正自减 1
  • O(Overflow):溢出标志,有符号运算的结果是否溢出,溢出则为 1,反之为 0,只对有符号运算有意义

DEBUG 中 -r 时 8 个标记(没有 TF)的对应 0 和 1 的取值:

CF: NC CY

PF: PO PE

AF: NA AC

ZF: NZ ZR

SF: PL NG

IF: DI EI

DF: UP DN

OF: NV OV

可以在 DEBUG 中验证标记位变化的 asm 代码:

; CF
; mov al, 0ffh
; add al, 1
; mov al, 0ffh
; add al, 2

; mov al, 0ffh
; add al, 0ffh

; PF
; mov al, 0
; add al, 3
; add al, 1
; inc al
; shr al, 2


; AF
; mov al, 0eh
; add al, 2
; or al, al
; dec al
; sub al, 1

; ZF, SF
; mov al, 1
; and al, 0
; inc al
; shl al, 7
; sar al, 7

; TF
;

; IF
; cli
; sti

; DF
; std
; cld
; std

; OF
; mov al, 0ffh
; add al, 080h
; add al, 7fh

CPU 进行的是有符号运算还是无符号运算这个意义是编程人员赋予的,CPU 在计算时会统一用补码进行运算,但是会同时把有符号和无符号运算的相关结果存储在标志寄存器中,比如当运算是无符号运算是是否有进位,当运算是有符号运算时是否有溢出,这样编程人员就可以依据自己赋予的意义去标志寄存器的对应标记取得相应的结果。