8086CPU存儲分段管理
問題1:8086是16位cpu,最多可訪問(尋址)多大內存?
- 運算器一次最多處理16位的數據。
- 地址寄存器的最大寬度為16位。
- 訪問的最大內存為:216 = 64K 即 0000 - FFFF。
問題2:8086允許最大內存1M,如何實現訪問(尋址)到所有內存?
- 8086CPU有20位地址總線,可以傳輸20位地址,達到1M尋址能力,但8086CPU是16位構造。
- 8086CPU采用一種在內部使用兩個16位地址合成的方式來形成一個20位的物理地址。
在8086cpu中,對存儲器的管理是采用分段管理的方式。將內存劃分成多段,通過段基址 + 段偏移 方式訪問。
8086CPU有20條地址線
- 最大可尋址控件為2 20 = 1MB
- 物理地址范圍從 00000H ~ FFFFFH
8086CPU 將1MB控件分成許多邏輯段
- 每個段最大限制為64K
- 段地址的低4位為0000B
物理地址和邏輯地址
- 物理地址:對應每個物理儲存單元都有唯一的20位地址編號,就是物理地址,從 00000H ~ FFFFFH。
- 邏輯地址:分段后在用戶編程時,采用的邏輯地址,形式為:段基地址:段內偏移地址
注意:
- 一個物理地址可以由任意個邏輯地址表示。
- 雖然一個物理地址可以由多個邏輯地址表示,但基于分段原則,一般編程中不會碰到。
邏輯地址解析:
- 段地址說明邏輯段在主存中的起始位置。
- 8086規定端地址必須是模16的地址。為什么?因為這樣處理器就不用多一次不必要的運算。
- 偏移地址說明主存單元距離短起始位置的偏移量
- 每段不超過64KB,偏移地址也可用16位數據表示。
邏輯地址與物理地址的轉換
將邏輯地址中的端地址左移4位,加上偏移地址就得到20位物理地址
一個物理地址可以有多個邏輯地址
內存地址 = 段基址 * 10H(<<4) + 段偏移
邏輯地址:1460 : 100、 1380 : F00
物理地址:14700H 、 14700H
例子:
- 段基址:073F,段偏移:0100? ??=? ??內存地址:073F0 + 100 = 074F0;
- 段基址:063F,段偏移:1200? ??=? ??內存地址:063F0 + 1200 = 075F0;
- 段基址:043F,段偏移:0120? ??=? ??內存地址:043F0 + 120 = 04510;
注意
- 段基址 + 段偏移 的方式一般寫作 段地址:段偏移,稱為邏輯地址。
- 偏移地址稱為 EA。(effective address)
- 通過邏輯地址計算出來的內存地址稱作為物理地址。
- 一個段最大是64K
- 一個段最小是0,即是不存在
-
段與段之間重疊1M內存最多可以劃分65535個段
-
段與段之間不重疊1M內存最多可以劃分?1M/64k = 16 個段
段劃分的原則
- 段大小可以不是64K。
- 段與段之間不能有重疊。
注意:
- 8086不會管分配,dos系統不會管分配,內存分段靠自己。
程序員可用內存,dos系統中編程,應用程序可用內存約600K。
段寄存器
8086中,段基地址都是存儲在段寄存器中,段偏移可以用立即數或者通用寄存器指明。
DS | 數據段,默認使用DX,SI,? DI |
CS | 代碼段,保存的是代碼,綁定CS:IP使用 |
SS | 堆棧段,用作函數棧,綁定SS:SP使用? 默認使用BP |
ES | 擴展段,常用于字符串操作 |
跨段訪問
在DOXBOX的Debuug環境下,
沒有段超越的指令實例:
MOV AX,[2000H] ; AX <- DS:[2000H]
從默認的DS數據段取出數據
采用段超越前綴的指令實例:
MOV AX,ES[2000H] ;AX <-- ES:[2000H]
從指定的ES附加段取出數據
使用A,U命令,默認是CS段;使用D,E命令,默認是DS段。
地址加法器
- 8086有20根地址線,16根數據線,其中數據線與地址線的低16位復用。
- 內部通過地址加法器計算地址。
訪問16位內存,20位地址內存誰更快?
訪問16位地址內存塊。因為不用經過地址加法器,直接到20根地址總線。
機器碼
匯編指令的組成:
- 指令由操作碼和操作數兩部分組成。
- 操作碼說明計算機要執行哪種操作,如傳送,運算,移位、跳轉等操作,它是指令不可缺少的部分。
- 操作數是指令的參與者,既各種操作的對象
- 有些指令不需要操作數,通常的指令都是一個或兩個操作數,也有個別指令是3個操作數甚至4個操作數。
- 指令系統設計了很多操作數的來源
- 尋找操作數的過程就是操作數的尋址
- 操作數采取哪一種尋址方式,會影響機器運行的速度和效率
機器碼的分析
問題:
- 內存中存儲的是機器碼,是一些16進制的數字,計算機是如何知道 多長的十六進制數字是代表一段執行機器碼的?
- 如何知道機器碼有多長?
- 如何知道操作數和源操作數的?
操作碼 操作數1,操作數2;注釋
- 操作數2,稱為源操作數 src,它表示參與指令操作的一個對象
- 操作數1,稱為目的操作數dest,它不僅可以作為指令操作的對象,還可以用來存放指令操作的結果
- 分號后的內容是對指令的解釋
給出如下代碼,分析mov
89C3 MOV BX,AX 1000 1001 1100 0011
89CB MOV BX,CX 1000 1001 1100 1011
89D3 MOV BX,DX 1000 1001 1101 0011
89DB MOV BX,BX 1000 1001 1101 1011
89E3 MOV BX,SP 1000 1001 1110 0011
89EB MOV BX,BP 1000 1001 1110 1011
89F3 MOV BX,SI 1000 1001 1111 0011
89FB MOV BX,DI 1000 1001 1111 101189C3 MOV BX,AX 1000 100 1 11 000 011
89CB MOV BX,CX 1000 100 1 11 001 011
89D3 MOV BX,DX 1000 100 1 11 010 011
89DB MOV BX,BX 1000 100 1 11 011 011
89E3 MOV BX,SP 1000 100 1 11 100 011
89EB MOV BX,BP 1000 100 1 11 101 011
89F3 MOV BX,SI 1000 100 1 11 110 011
89FB MOV BX,DI 1000 100 1 11 111 011
如上可以得出結論:
16位寄存器是按位存儲的
- ax - 000、 cx - 001、 dx - 010、 bx - 011、sp - 100、 bp - 101、 si - 110、 di - 111
mov si, di
1000 1001 1111 1110 89fe88C7 MOV BH,AL 1000 1000 1100 0111
88E7 MOV BH,AH 1000 1000 1110 0111
88DF MOV BH,BL 1000 1000 1101 1111
88FF MOV BH,BH 1000 1000 1111 1111
88CF MOV BH,CL 1000 1000 1100 1111
88EF MOV BH,CH 1000 1000 1110 1111
88D7 MOV BH,DL 1000 1000 1101 0111
88F7 MOV BH,DH 1000 1000 1111 011188C7 MOV BH,AL 1000 100 0 11 000 111
88E7 MOV BH,AH 1000 100 0 11 100 111
88DF MOV BH,BL 1000 100 0 11 011 111
88FF MOV BH,BH 1000 100 0 11 111 111
88CF MOV BH,CL 1000 100 0 11 001 111
88EF MOV BH,CH 1000 100 0 11 101 111
88D7 MOV BH,DL 1000 100 0 11 010 111
88F7 MOV BH,DH 1000 100 0 11 110 111
如上可得出結論:
8位寄存期也是按照位來存儲的,分別如下:
al - 000、 cl - 001、 dl - 010、 bl - 011、 ah - 100、 ch - 101、 dh - 110、 bh - 111
89FE MOV SI,DI 1000 1001
88FE MOV DH,BH 1000 100089C3 MOV BX,AX 1000 10 0 1 11 000 011
89CB MOV BX,CX 1000 10 0 1 11 001 011
89D3 MOV BX,DX 1000 10 0 1 11 010 011
89DB MOV BX,BX 1000 10 0 1 11 011 011
89E3 MOV BX,SP 1000 10 0 1 11 100 011
89EB MOV BX,BP 1000 10 0 1 11 101 011
89F3 MOV BX,SI 1000 10 0 1 11 110 011
89FB MOV BX,DI 1000 10 0 1 11 111 011
88C7 MOV BH,AL 1000 10 0 0 11 000 111
88E7 MOV BH,AH 1000 10 0 0 11 100 111
88DF MOV BH,BL 1000 10 0 0 11 011 111
88FF MOV BH,BH 1000 10 0 0 11 111 111
88CF MOV BH,CL 1000 10 0 0 11 001 111
88EF MOV BH,CH 1000 10 0 0 11 101 111
88D7 MOV BH,DL 1000 10 0 0 11 010 111
88F7 MOV BH,DH 1000 10 0 0 11 110 1118B07 MOV AX,[BX] 1000 10 1 1 00 000 111 1000 10 d w mod rrr rrr/mmm
8B05 MOV AX,[DI] 1000 10 1 1 00 000 101
8B03 MOV AX,[BP+DI] 1000 10 1 1 00 000 011
8B00 MOV AX,[BX+SI] 1000 10 1 1 00 000 000
8B4212 MOV AX,[BP+SI+12] 1000 10 1 1 01 000 010 disp8
8B825634 MOV AX,[BP+SI+3456] 1000 10 1 1 10 000 010 disp16
8A825634 MOV AL,[BP+SI+3456] 1000 10 1 0 10 000 010 disp16
8B817856 MOV AX,[BX+DI+5678] 1000 10 1 1 10 000 001 disp16
89817856 MOV [BX+DI+5678],AX 1000 10 0 1 10 000 001 disp16
如上可得出結論:
前面6位是操作碼
d:代表源操作數是寄存器還是內存
- 0:從寄存器里面取值
- 1:從內存里面取值
w:目的操作數寬度
oo:模式
- 11:寄存器到寄存器
- 10:DISP 16位
- 01:DISP 8 位
- 00:內存到寄存器,沒有偏移
89FE MOV SI,DI 1000 1001
88FE MOV DH,BH 1000 100089C3 MOV BX,AX 1000 10 0 1 11 000 011
89CB MOV BX,CX 1000 10 0 1 11 001 011
89D3 MOV BX,DX 1000 10 0 1 11 010 011
89DB MOV BX,BX 1000 10 0 1 11 011 011
89E3 MOV BX,SP 1000 10 0 1 11 100 011
89EB MOV BX,BP 1000 10 0 1 11 101 011
89F3 MOV BX,SI 1000 10 0 1 11 110 011
89FB MOV BX,DI 1000 10 0 1 11 111 011
88C7 MOV BH,AL 1000 10 0 0 11 000 111
88E7 MOV BH,AH 1000 10 0 0 11 100 111
88DF MOV BH,BL 1000 10 0 0 11 011 111
88FF MOV BH,BH 1000 10 0 0 11 111 111
88CF MOV BH,CL 1000 10 0 0 11 001 111
88EF MOV BH,CH 1000 10 0 0 11 101 111
88D7 MOV BH,DL 1000 10 0 0 11 010 111
88F7 MOV BH,DH 1000 10 0 0 11 110 1118B07 MOV AX,[BX] 1000 10 1 1 00 000 111 1000 10 d w mod rrr rrr/mmm
8B05 MOV AX,[DI] 1000 10 1 1 00 000 101
8B03 MOV AX,[BP+DI] 1000 10 1 1 00 000 011
8B00 MOV AX,[BX+SI] 1000 10 1 1 00 000 000
8B4212 MOV AX,[BP+SI+12] 1000 10 1 1 01 000 010 disp8
8B825634 MOV AX,[BP+SI+3456] 1000 10 1 1 10 000 010 disp16
8A825634 MOV AL,[BP+SI+3456] 1000 10 1 0 10 000 010 disp16
8B817856 MOV AX,[BX+DI+5678] 1000 10 1 1 10 000 001 disp16
89817856 MOV [BX+DI+5678],AX 1000 10 0 1 10 000 001 disp16 8E1E1200 mov bx,[0012] 1000 1110 0001 1110 0001 0002 0000 0000
8A1E1200 mov bx,[ds+12]8B078B058B038B008B42128B8256348A8256348B81785689817856*******立即數 到寄存器*********
BB3412 MOV BX,1234 1011 1 0 11 0011 0100 0001 0010
BB1200 mov bx,12 1011 1 0 11
BE1200 mov si,12 1011 1 111 BB1200 mov bx,12
BB3412 MOV BX,1234
B712 mov bh,12*******立即數 到 內存********* 1100 011 w oo 000 mmm 立即數
C60712 mov byte ptr [bx],12 1100 011 0 00 000 111 0001 0010
C60012 mov byte ptr [BX+SI],12 1100 011 0 00 000 000 0001 0010
C60212 mov byte ptr [BP+SI],12 1100 011 0 00 000 010 0001 0010C60712C60012C60212
****** 內存 到 段寄存器*****
8E1F mov ds,[bx]*******寄存器 到 段寄存器*****
8ED8 mov ds,ax 1000 1110 11 011 000
8CC8 mov ax,cs 1000 1100 11 001 000
段寄存器編號分析
8EC8 mov cs,ax 1000 1110 11 001 000
8ED8 mov ds,ax 1000 1110 11 011 000
8EC0 mov es,ax 1000 1110 11 000 000
8ED0 mov ss,ax 1000 1110 11 010 000es,cs,ss,ds