04_物理地址算法
寄存器: 汇编就是通过汇编指令修改寄存器中的内容 寄存器 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