寄存器: 汇编就是通过汇编指令修改寄存器中的内容
寄存器 debug -r

AX(AH + AL) BX(BH + BL) CX(CH + CL) DX(DH + DL) = 0000(H)
通用寄存器, 一般存放数据, 两个16进制数, 最大FFFF(1111 1111 1111 1111), 十进制 65535, 两个字节构成.
AX = AH + AL 互相独立的寄存器
H: high 高八位 2^8-1 = 0-255
L: low 低八位 2^8-1 = 0-255
SP = 00FD BP = 0000(H) 偏移地址寄存器
SI DI = 0000(H) 偏移地址寄存器
DS EC SS CS = 073F(H) 段地址寄存器
IP = 0100(H) 偏移地址寄存器
NV UP EI PL NZ NA PO NC
另: BX 也可以是偏移地址寄存器
# DosBox操作
debug
-a mov ax,4e20(两个回车)
-r 查看寄存器
-t 执行
-d 查看地址信息
-a mov cl,al # 将AX的低八位移动到CX的低八位
-a mov ad,8 # 将 0008(H) 移动到AX寄存器中 AX = 0008(H)
-a add ax,8 # 给 AX 寄存器加 0008(H) AX = 0010
注意:
如果相加超出寄存器范围, 则截取后四位显示(高八位和低八位都是独立的, 各自都会截取)
高/低八位的寄存器不能与十六位寄存器(AX..)进行直接运算
-d解释:
左边: 1,2: 段地址 3,4: 偏移地址(最大FFFF)
右边:
1 2 3 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 宽度 16
073F:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
073F:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 2E 07 ............4...
073F:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
073F:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
073F:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
073F:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
073F:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
073F:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
物理地址 = 段地址*10H(段寄存器左移四位,相当于右边拼接一个十六进制0) + 偏移地址(cpu的地址加法器完成的)
根本原因 = 8086CPU, 寄存器只能表示3位的地址 比如: 2864 = 200 * 10 + 864
8086CPU, 地址总线是20位的, 即可以寻址能力可以达到1M字节, 但是它的ALU和寄存器都只有16位, 也就是表示数的能力只能达64k,于是用两个寄存器对来表示一个物理地址,
这两个寄存器都是16位, 直接相加还是不能匹配20位的地址线的访问能力, 地址加法器将两个16位地址合成为一个20位的物理地址,
地址加法器通过内部总线将20位物理地址送入输入输出控制电路, 输入输出控制电路将20位物理地址送上地址总线, 20位物理地址被地址总线传送到存储器
# 练习
1. 地址段为 0001H, 如果只能通过偏移地址来寻址, 则CPU的寻址范围:
0001H * 10H + 0H = 10H
0001H * 10H + FFFF = 0010H + FFFF = 1000F
0010
FFFF
1000F
2. 有一数据存放在内存20000H中, 现在给定地址段a, 如果只用偏移地址找到20000H, 那么段地址应该满足的最大最小值是什么
A * 10H + 0 = 20000H A = 20000H / 10 = 2000H 最大
A * 10H + FFFF = 20000H A = (20000H -FFFF) / 10 = 1000H 最小
- FFFF
10001

