寄存器

Tutorial: 汇编基础 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
  1. 通用寄存器
8086CPU 举例.
8086CPU寄存器都是16位, AX/BX/CX/DX, 这4个寄存器通常用来存放一般性的数据, 被称为通用寄存器(0-65535)

为了兼容 8位寄存器的程序, AX/BX/CX/DX 可拆分两个独立的 8 位寄存器(0-255)
AX ->  高位 AH + 低位 AL
  1. debug 下常用的指令 -g 执行完 exe 运行结果显示 -a 编写汇编命令 -t 单步执行 -p 直接执行完不是单步执行 -u 反编译 -r 查看修改寄存器的值 -d 查看内存单元 -e 修改内存单元
Z:\>DEBUG
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0100 NV UP EI NG NZ NA PO NC
0DAB:0100 C3                RET
-a
0DAB:0100 mov ax,4E20
0DAB:0103 mov cl,al
0DAB:0105 mov dx,ax
0DAB:0107
-t
AX=4E20 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0103 NV UP EI NG NZ NA PO NC
0DAB:0103 88C1              mov     CL,AL
-t
AX=4E20 BX=0000 CX=0020 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0105 NV UP EI NG NZ NA PO NC
0DAB:0105 89C2              mov     DX,AX
-t
AX=4E20 BX=0000 CX=0020 DX=4E20 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0107 NV UP EI NG NZ NA PO NC
0DAB:0107 0000              add     [BX+SI],AL                       DS:0000=CD
  1. 标志寄存器及其含义 NV UP EI NG NZ NA PO NC
8086CPU标志寄存器的结构
15  14  13  12  11  10  9  8  7  6  5  4  3  2  1  0
                OF  DF  IF TF SF ZF    AF    PF    CF
OF <-----> OV(1) ; NV(0)
DF <-----> DN(1) ; UP(0)
IF <-----> EI(1) ; DI(0)
SF <-----> NG(1) ; PL(0)
ZF <-----> ZR(1) ; NZ(0)
AF <-----> AC(1) ; NA(0)
PF <-----> PE(1) ; PO(0)
CF <-----> CY(1) ; NC(0)

1、OF(11):溢出标志位 (Overflow Flag)
OV : overflow	NV : no overflow
(有符号运算)溢出标志位:在进行有符号运算的时候, 如果结果超过了机器所表示的范围, 称为溢出.
8位带符号数的范围是-128 ~ +127, 16位的是-32728 ~ +32767).
如果不存在溢出:OF == 0 (展示为NV)
如果存在溢出:  OF == 1 (展示为OV)

2、DF(10):方向标志位 (Direction Flag)
UP : up	DN :down
表示串操作时按地址减或加的方式进行.
每次操作si di 递增:df == 0 (展示为UP)
每次操作si di 递减:df == 1 (展示为DN)

3、IF(9):中断标志位 (interrupt-enable Flag)
EI : enable interrupt	DI : disable interrupt
表示CPU可否响应可屏蔽中断请求.IF的状态对不可屏蔽中断及内部中断没有影响.
展示为DI: 0, 关闭中断
展示为EI: 1, 打开中断

4、SF(7):符号标志位 (Sign Flag)
PL : plus	NG : negative
表示运算结果是负(最高位为1)或非负(最高位为0)
当运算结果为非负:SF == 0 (展示为PL)
当运算结果为负:  SF == 1 (展示为NG)

5、ZF(6):0标志位 (Zero Flag)
ZR : zero	NZ : no zero
表示运算结果是0或非0.
当运算结果不为0:zf == 0 (展示为NZ)
当运算结果为0:  zf == 1 (展示为ZR)

6、AF(4):辅助进位标志 (Auxiliary Carry Flag)
AC : assistant carry	NA : no assistant carry
在8位加减法操作中表示低4位向高4位有无进/借位.
无进/借位:AF == 0 (展示为NA)
有进/借位:AF == 1 (展示为AC)

7、PF(2):奇偶标志位 (Parity Flag)
PE : parity even	PO : parity odd
记录相关指令执行后, 其结果的所有二进制位中的1的个数是否为偶数.
当所有二进制位的1的个数是奇数:PF == 0 (展示为PO)
当所有二进制位的1的个数是偶数:PF == 1 (展示为PE)

8、CF(0):进位标志位 (Carry Flag)
CY : carry	NC : no carry
表示加减法操作中最高位有无进/借位.
如果运算不存在进位/借位:CF == 0 (展示为NC)
如果运算存在进位/借位:  CF == 1 (展示为CY)

9、TF(8):追踪标志 (Trap Flag)
当追踪标志TF == 1时, CPU进入单步执行方式.
  1. 字在寄存器中的存储
出于兼容性的考虑, 8086CPU 可一次性处理两种尺寸的数据
字节:记为byte, 可以存在8位寄存器中
字:  记为word, 一个字由两个字节组成, 这两个字节分别称为高位字节和低位字节

一个寄存器最大存储一个字节 255 = FFH = 1111 1111
AX = FFFFH = 65535 = 1111 1111(高位字节) 1111 1111(低位字节) = 1 个 字
  1. 溢出截取 8226H + 8226H = 1 044C(NV => OV) 低位(AL、BL 等)溢出, 也会截取, 并不会进位(寄存器是相互独立的)
Z:\>DEBUG
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0100 NV UP EI NG NZ NA PO NC
0DAB:0100 C3                RET
-a
0DAB:0100 mov ax,8226
0DAB:0103 mov bx,ax
0DAB:0105 add ax,bx
0DAB:0107
-t
AX=8226 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0103 NV UP EI NG NZ NA PO NC
0DAB:0103 89C3              mov     BX,AX
-t
AX=8226 BX=8226 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0105 NV UP EI NG NZ NA PO NC
0DAB:0105 01D8              add     AX,BX
-t
AX=044C BX=8226 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=0DAB IP=0107 OV UP EI PL NZ NA PO CY
0DAB:0107 0000              add     [BX+SI],AL                       DS:8226=00