04_實體地址演算法
阿新 • • 發佈:2022-03-20
暫存器: 彙編就是通過彙編指令修改暫存器中的內容 暫存器 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