分段管理,段超越前綴,機器碼格式


 

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. 808620條地址線,最大可尋址范圍0 ~ 2^20 - 1,即00000 ~ FFFFF,可尋址1M內存。

2. 80861M的存儲空間分成多個段,每段最大64KB,范圍0000 ~ FFFF。采用物理地址=段地址+偏移地址的方式訪問地址:reg * 10h + offset。例如要訪問地址12345h,表示為12340005,實際地址為1234h * 10h + 5 = 12345h。也可以表示為12300045,即1230h * 10h + 45h = 12345h

  1. 因此,一個物理地址可以有多種表示方法,稱為有多個邏輯地址。

 

二. 段寄存器

段寄存器(CS, DS, ES, SS)用於存儲段地址,當訪問內存數據時,需要先規划好段地址。

  1. CS Code Segment 代碼段,CSIP取得下一條要執行的指令,CS存放代碼段的段地址,IP存放下條指令的偏移地址。
  2. DS Data Segment數據段,例如11AD875為止存在一個字符串,想顯示它,需要確保DS的值為11ADDS不是通用寄存器,所以不能用mov指令直接賦值,要通過通用寄存器中轉一下。先mov ax, 11ADmov ds, ax,隨后可調用int 21中斷顯示字符串。
  3. SS Stack Segment堆棧段,SSSP取得棧頂數據,SS存放堆棧段的段地址,SP存放棧頂的偏移地址。
  4. ES Extra Segment附加段,附加段是附加的數據,也用於數據的保存。串操作指令將附加段作為其目的操作數的存放區域。
  5. 隨着發展,80386 處理器增加了FSGS,也是附加段,它們沒有縮寫。

 

三. 段超越前綴指令

沒有指明時,一般的數據訪問在DS段,但也可以指令訪問哪個段。

例如mov ax, [2000]默認訪問DS:[2000]

mov ax, ES: [2000]則訪問ES:[2000]

但要注意寫法,先寫前綴:

 

 

 

 

 

例如寫了以下代碼:

 

 

 

 

 

 

 

可見mov ax,[2000]指令的機器碼相同,只是多了段超越前綴,每個前綴只影響下面的一條指令。

 

四. 機器碼格式

  1. 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

 

五. 流水線

 

 

 

圖中是一個簡單的流水線,除了剛啟動時,之后取址和譯碼可以在同一時間都運行,提高了效率。

流水線設計有長流水線和多流水線,長流水線任務切分細,設計簡單,但是如果指令預測失敗,已完成的任務都白費,付出的代價高。多流水線任務切分粗,設計復雜,需要額外管理成本,但是如果指令預測失敗,付出的代價低相對較低。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM