8個通用寄存器
|
|
16 bit |
|
|
accumulate |
ax |
ah |
al |
R0 |
count |
cx |
ch |
cl |
R1 |
data |
dx |
dh |
dl |
R2 |
base |
bx |
bh |
bl |
R3 |
stack |
sp |
|
R4 |
|
stack base |
bp |
|
R5 |
|
source |
si |
|
R6 |
|
destination |
di |
|
R7 |
一.存儲器的分段管理
1. 8086有20條地址線,最大可尋址范圍0 ~ 2^20 - 1,即00000 ~ FFFFF,可尋址1M內存。
2. 8086將1M的存儲空間分成多個段,每段最大64KB,范圍0000 ~ FFFF。采用物理地址=段地址+偏移地址的方式訪問地址:reg * 10h + offset。例如要訪問地址12345h,表示為1234:0005,實際地址為1234h * 10h + 5 = 12345h。也可以表示為1230:0045,即1230h * 10h + 45h = 12345h。
- 因此,一個物理地址可以有多種表示方法,稱為有多個邏輯地址。
二. 段寄存器
段寄存器(CS, DS, ES, SS)用於存儲段地址,當訪問內存數據時,需要先規划好段地址。
- CS :Code Segment 代碼段,CS:IP取得下一條要執行的指令,CS存放代碼段的段地址,IP存放下條指令的偏移地址。
- DS :Data Segment數據段,例如11AD:875為止存在一個字符串,想顯示它,需要確保DS的值為11AD。DS不是通用寄存器,所以不能用mov指令直接賦值,要通過通用寄存器中轉一下。先mov ax, 11AD再mov ds, ax,隨后可調用int 21中斷顯示字符串。
- SS :Stack Segment堆棧段,SS:SP取得棧頂數據,SS存放堆棧段的段地址,SP存放棧頂的偏移地址。
- ES :Extra Segment附加段,附加段是附加的數據,也用於數據的保存。串操作指令將附加段作為其目的操作數的存放區域。
- 隨着發展,80386 處理器增加了FS和GS,也是附加段,它們沒有縮寫。
三. 段超越前綴指令
沒有指明時,一般的數據訪問在DS段,但也可以指令訪問哪個段。
例如mov ax, [2000]默認訪問DS:[2000],
mov ax, ES: [2000]則訪問ES:[2000]。
但要注意寫法,先寫前綴:
例如寫了以下代碼:
可見mov ax,[2000]指令的機器碼相同,只是多了段超越前綴,每個前綴只影響下面的一條指令。
四. 機器碼格式
- mov指令
將每條指令機器碼的前2字節轉成二進制,發現前半部分固定的是指令,后半部分是寄存器編號:
指令 寄存器
10111 000 ax
10111 001 cx
10111 010 dx
10111 011 bx
10111 100 sp
10111 101 bp
10111 110 si
10111 111 di
五. 流水線
圖中是一個簡單的流水線,除了剛啟動時,之后取址和譯碼可以在同一時間都運行,提高了效率。
流水線設計有長流水線和多流水線,長流水線任務切分細,設計簡單,但是如果指令預測失敗,已完成的任務都白費,付出的代價高。多流水線任務切分粗,設計復雜,需要額外管理成本,但是如果指令預測失敗,付出的代價低相對較低。