32位微處理器指令系統之尋址方式

尋址方式概述

一條指令包含操作碼和操作數兩部分,

1)操作碼(指令助記符)指出該指令要進行的操作,

2)操作數指出該指令需要的操作數或操作數的地址。

操作數在計算機中的位置及存取方式表。

32位微處理器指令系統之尋址方式

操作數在計算機中的位置及存取

指令根據一定的方式,先找到存儲操作數的空間地址,然後取出操作數進行運算。尋找操作數的方式稱為尋址方式。

尋址方式:指令根據一定的方式,先找到存儲操作數的空間地址,然後取出操作數進行運算。尋找操作數的方式稱為尋址方式。

操作數地址由 段基址 和 段內偏移地址共同產生。

段基址由段基址寄存器提供,有CS、SS、DS、ES、FS和GS。

段內偏移地址也稱為有效地址EA(effective address),

32位有效地址的公式是:
EA = 基址 +(變址*比例因子)+ 位移量

32位尋址方式時段寄存器、基址寄存器、變址寄存器、比例因子和位移量的關係:

32位微處理器指令系統之尋址方式

備註:

1.在表中,如果以EBP和ESP為基址寄存器,默認訪問的是堆棧段,段寄存器是SS。

若以其他6個寄存器為基址寄存器,默認訪問的是數據段,段寄存器是DS。

2.如果數據存放在內存的附加數據段 時,需使用段超越前綴“ES:”、“FS:”或“GS:”,才能訪問到相應附加數據段中的數據。

3.在串操作時,源串默認的段寄存器是DS,目的串默認的段寄存器是ES。

4.數據存放在內存的堆棧段時,默認的段寄存器為SS。

5.比例因子只能是1、2、4、8。

6.位移量是8位或32位的帶符號數,所謂帶符號數是指補碼錶示的二進制數。

7.立即尋址時,段寄存器為CS,以IP(16位)或EIP(32位)為段內偏移地址,找到指令的同時也就找到了數據。

8.16位尋址方式時段寄存器、基址寄存器、變址寄存器和位移量的關係見表

32位微處理器指令系統之尋址方式

在介紹各種尋址方式之前,先說明指令格式中出現的助記符號:

32位微處理器指令系統之尋址方式

指令格式中出現的助記符號

立即尋址

操作數位置:內存代碼段。

立即尋址方式所提供的操作數緊跟在操作碼的後面,與操作碼一起放在指令代碼段中。 立即數可以是8位無符號整數或16位無符號整數,但不可以是小數。如果是16位數,則低位字節存放在低地址中,高位字節存放在高地址中。 立即尋址方式只能用於源操作數字段,不能用於目的操作數字段,經常用於給寄存器賦初值。

寄存器尋址

說明:寄存器中寄存的內容就是操作數。

操作數位置:CPU中的某個寄存器。

例1, INC AX

其中,INC為+1指令操作符,其操作數地址為寄存器AX在機器指令中的編碼,不同的寄存器使用不同的編碼加以編排。本條指令的操作數就在AX中。假定執行前(AX)=1234H,則執行後(AX)=1235H。

例2:ADD EAX,EBX

這是一條雙操作數指令,其中ADD為加法指令操作符,它的兩個加數分別由EAX和EBX提供。假定執行前(EAX)=12345678H,(EBX)=00000034H,則執行後(EAX)=123456ACH,EBX寄存器值不變。

存儲器尋址方式

操作數位置:通常在內存數據段DS與堆棧段SS中。

程序運行所使用的數據大都保存在主存儲器中,用指令存取存儲器操作數的方式較多,即存儲器尋址的方式較多。

1.直接尋址

在直接尋址方式中,操作數的16或32位偏移地址EA緊跟在指令操作碼後面,即操作數的偏移地址EA與操作碼一起存放在代碼段中,而操作數可以存放在數據段,也可以存放在其他段。

例3: 假定在數據段DS有雙字變量定義為:

VAR DD 12345678H(32位)

其中VAR是變量名,在經過彙編與連接生成可執行程序在執行時,

它有實際物理地址,由段寄存器DS與偏移地址EA組成。

在執行指令MOV EAX,VAR時,

其功能是:根據變量名VAR的DS和EA,

從數據段內偏移地址為EA的內存單元,

連續讀取4個字節數送給EAX,

即(EAX)=12345678H。

(EAX)表示EAX中的內容。

2.基址尋址

以8個基址寄存器中任一個寄存器中的值 作為操作數的偏移地址,

其中,以EAX、EBX、ECX、EDX、ESI、EDI作為基址寄存器時,

默認訪問段是數據段DS,

以EBP和ESP作為基址寄存器時,默認訪問的段是堆棧段SS。

例4: MOV AX,[EBX] ;訪問DS段

MOV AX,[EBP] ;訪問SS段

3.基址加位移尋址

以8個32位通用寄存器中任意一個寄存器作為基地址寄存器,

再加上8位或32位的位移量,(位移量可以是正,也可以是負),

修改基地址寄存器的值使之成為新的所要尋找操作數的偏移地址。

默認的段與基址尋址相同。

例5: MOV AX,[EBX-08H] ;訪問DS段

MOV AX,[EBP+34H] ;訪問SS段

4.比例變址尋址

選取除ESP之外的7個32位通用寄存器中任意一個寄存器作為變址寄存器,

將變址寄存器的值乘以一個比例常數(1、2、4、8),最後形成操作數的偏移地址。

例6:

MOV AX, [EBX*2] ;訪問DS段

MOV ECX,[EBP*8] ;訪問SS段

基址寄存器和變址寄存器如果同時出現時一般用於高級語言中的二維數組,如a[i][j]

基址寄存器中放i,變址寄存器中放j如a[i];只需一個基址寄存器中放i就好 ;

段首地址由DS,ES,SS等確定;就是那個a

所以,尋址方式多是為了滿足高級語言的需要。

如a[i][j]:i是行偏移,j是列偏移。

比例的作用是為了表示不同的類型如 int a[i][j]和 float a[i][j]

類型不同,每個數據所佔的字節不同

加比例因子說明每次讀取相應的字節。

ESP做堆棧指針,不能隨便賦值

5.比例變址加位移尋址

選取除ESP之外的7個32位通用寄存器中任意一個寄存器作為變址寄存器,將變址寄存器的值乘以一個比例常數(1、2、4、8),將換算結果再加上帶符號的8位或32位的位移量,最後形成操作數的偏移地址。

例7

MOV AX,[EBX*2-30H] ;訪問DS段

MOV AX,[EBP*8+4567H] ;訪問SS段

6.基址加比例變址尋址

以8個32位通用寄存器中任意一個寄存器作為基地址寄存器,再加上除ESP之外的7個32位通用寄存器中任意一個寄存器作為變址寄存器,將變址寄存器的值乘以一個比例常數(1、2、4、8),其換算結果作為操作數的偏移地址;由基址寄存器確定使用DS段還是SS段,其規定相同於基址尋址。

例8

MOV AL,[EDX+EBP*2] ;EDX是基址寄存器,訪問DS段

MOV EAX,[EBP+ECX*8] ;EBP是基址寄存器,訪問SS段

MOV EAX,[EBX][EDI] ;EBX是基址寄存器,訪問DS段

MOV EAX,[ESP][EBP] ;ESP是基址寄存器,訪問SS段

7.基址加比例變址加位移尋址

這種尋址方式是在基址加比例變址尋址基礎上,再加上8或32位位移量,構成32位偏移地址。實際上它是公式3-1即EA = 基址+(變址*比例因子)+位移量的綜合應用。

例9

MOV BL,[ESI+EBP*2+60H] ;訪問DS段

MOV EAX,[EBP+EDI*8+3344H] ;訪問SS段

MOV EAX,[EBP][EDX] ;EBP是基址寄存器,訪問SS段

基址 +(變址*比例因子)+ 位移量

注意:
指令MOV AX,3[BX] ,MOV AX, 2[BX+SI] 中的3[BX]與 2[BX+SI]是什麼意思?
3[BX] 與2[BX+SI]是尋址方式的表示形式,
3[BX]是相對基址尋址,
2[BX+SI]是相對基址加變址尋址。
這兩種尋址方式都是用於尋找內存操作數的,
用來指定內存操作數的地址。
3[BX]指示的內存偏移地址為:BX+3;
2[BX+SI]指示的內存偏移地址為:BX+SI+2。

8.16位的存儲器尋址方式

32位CPU兼容16位CPU的尋址方式,也兼容16位的指令系統,在編寫32位程序時,不可避免地要使用16位指令系統編程,在16位CPU的尋址方式中,存儲器尋址仍然是主要的,這是因為16位的立即尋址、寄存器尋址與32位的相同,容易理解,下面簡單介紹16位的存儲器尋址方式。

(1)直接尋址

指令中直接給出了16位偏移地址,物理地址=段寄存器值*16+偏移地址。

例10

MOV BL,[2060H] ;訪問DS段

MOV AX,[3344H] ;訪問DS段

(2)基址尋址

指令中以基址寄存器BX或BP中值為16位的偏移地址訪問內存,

物理地址 = 段寄存器值*16 + 偏移地址。

以BX和BP為基址寄存器分別訪問數據段和堆棧段。

例11

MOV AL,[BX] ;訪問DS段

MOV DX,[BP] ;訪問SS段

關於基址尋址,還有另外一種形式,稱為相對基址尋址,

它是在基址寄存器的基礎上,加上一個帶符號的8位或16位的位移量。

例12

MOV AL,[BX+30H] ;訪問DS段

MOV DX,[BP-1110H] ;訪問SS段

(3)變址尋址

指令中以源變址寄存器SI或目的變址寄存器DI中值為16位的偏移地址訪問內存,

物理地址=段寄存器值*16+偏移地址。所訪問的數據段都是DS數據段。

例13

MOV AL,[SI] ;訪問DS段

MOV DX,[DI] ;訪問DS段

關於變址尋址,還有另外一種形式,稱為相對變址尋址,

它是在變址寄存器的基礎上,加上一個帶符號的8位或16位的位移量。

例14

MOV AL,[SI-40H] ;訪問DS段

MOV DX,[DI+1000H] ;訪問DS段

(4)基址(加)變址尋址

指令中以基址寄存器的值加上變址寄存器的值所換算的結果作為偏移地址訪問內存,基址寄存器與變址寄存器的組合以及默認訪問的段。

例15

MOV AL,[BX+SI] ;訪問DS段,可以寫成MOV AL,[BX][SI]形式

MOV DX,[BP+DI] ;訪問SS段,可以寫成MOV DX,[BP][DI]形式

(5)相對基址(加)變址尋址

相對基址(加)變址尋址是在基址(加)變址尋址的基礎之上,加上一個帶符號的8位或16位的位移量,最後形成一個16位的偏移地址,所訪問的段、基址寄存器與變址寄存器的組合與上述的相同。

例16

MOV AL,[BX+SI+10H] ;訪問DS段,可以寫成MOV AL,[BX][SI+10H]形式

MOV DX,[BP+DI-29H] ;訪問SS段,可以寫成MOV DX,[BP][DI-29H]形式


分享到:


相關文章: