IA32體系結構2(x86尋址方式)

數據尋址方式

8086~80286微處理器的數據尋址方式包括:

1.寄存器尋址

2.立即尋址

3.直接尋址

4.寄存器間接尋址

5.基址加變址尋址

6.寄存器相對尋址

7.相對基址加變址尋址

80386以上處理器還包括:

8.比例變址方式的存儲器數據尋址

一些說明

這麼多的尋址方式,有些比較直觀,有些就很頭大,什麼叫基址加變址尋址?這要從x86的寄存器說起,話說x86有8個通用寄存器:EAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI。其實每個寄存器,都是有相對特定的用途的,只是不是所有用途都是強制規定,每個寄存器的常見用途如下:

1.EAX-累加器

2.EBX-基址:EBX用於保存訪問存儲單元的偏移地址。

3.ECX-計數器:可以保存很多指令需要用到的計數值,比如串指令、移位指令、loop指令。

4.EDX-數據

5.EBP-基址針

6.ESI-源變址

7.EDI-目標變址

8.ESP-棧指針

所以,所謂的基址加變址尋址就是以EBX(BX)或者EBP(BP)加上EDI或者ESI的尋址方式。這樣一來,我們基本能明白,那麼多的尋址方式是怎麼回事了。說到底,數據尋址方式,就是如何尋址數據的一些方法。無非就是寄存器到寄存器、寄存器到存儲器、存儲器到存儲器之間的數據傳送,這些傳送方式需要遵循一定的規則,不是想怎麼傳就能怎麼傳的,比如,不是所有指令都支持存儲器到存儲器的數據傳送的。這應該是由cpu設計決定的,還無法做到任意數據單元之間的任意數據搬移。

數據尋址方式詳解

以mov指令爲例,詳細說明各種尋址方式是怎麼回事,首先看下mov指令格式:

MOV AX,BX

intel標準彙編格式,源操作數在右邊,目標操作數在左邊。其中MOV是操作碼。這條指令,將BX寄存器內容複製到AX寄存器中。

1.寄存器尋址

把一個字節/字/雙字的副本從源操作數寄存器或者存儲單元傳送到目標操作數寄存器或者存儲單元。比如:

mov cx,dx

講dx寄存器的內容複製到cx寄存器中。

2.立即尋址

將源立即數傳送到目標寄存器或者存儲單元。比如:

mov ebx, 12345678H

將雙字數據12345678H複製到ebx寄存器中。

3.直接尋址

在存儲單元和寄存器之間傳送字節/字/雙字。比如:

mov cx,LIST

將存儲單元LIST的字內容複製到寄存器cx中。

4.寄存器間接尋址

在寄存器和存儲單元之間傳送數據,而存儲單元由變址或者基址寄存器尋址。變址和基址寄存器是BP、BX、DI、SI。比如:

mov ax, [bx]

將數據段中BX寄存器內容作爲偏移地址的存儲單元的數據複製到寄存器ax中。

5.基址加變址尋址

在寄存器和存儲單元之間傳送一個字節/字/雙字,該存儲單元由基址寄存器(BP或BX)加變址寄存器(DI或SI)尋址,比如:

mov [bx+di], cl

將寄存器cl的字節內容複製到數據段中BX加DI尋址的存儲單元中。

6.寄存器相對尋址

在寄存器和變址尋址的存儲單元或基址寄存器加位移量尋址的存儲單元之間傳送數據。比如:

mov ax,[bx+4]或者mov ax,ARRAY[bx]

第一條指令將數據段中由bx加4尋址的單元的內容裝入ax。第二條指令將數據段中由ARRAY加bx內容尋址的存儲單元中的數據裝入ax。

7.相對基址加變址尋址

在寄存器和存儲單元之間傳送數據,該存儲單元是由基址寄存器加變址寄存器再加位移量尋址的。比如:

mov ax, ARRAY[bx+di]

用ARRAY,bx和di相加形成存儲單元地址,將該地址處的字數據裝入ax。

8.比例變址尋址

這種尋址方式只能用於80386以上微處理器。對寄存器中的第二個寄存器內容用2倍、4倍或8倍比例因子修改,產生操作數的存儲器地址,比如:

mov edx,[eax+4*ebx]

將數據段中地址爲eax加上4倍ebx的存儲單元的內容裝入edx。

以上信息來源《intel微處理器結構、編程與接口》第六版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章