1. 程式人生 > 實用技巧 >組合語言-定址方式-地址和資料相關的定址方式

組合語言-定址方式-地址和資料相關的定址方式

資料相關的定址方式

1 立即定址方式

直接使用立即數來處理

mov al,5
mov ax,3064H

2 暫存器定址方式

運算元在暫存器中,直接使用暫存器賦值來讀取內部的運算元。

另外的方式的簡介:

在8086中把運算元的偏移地址稱為有效地址,以下的操作都是取得有效地址(EA)的不同途徑。

有效地址可以由以下四種成分:

位移量(displacement):存放的是一個地址。

基址(base):基址部分,通常用來指資料段中資料或字串的首地址

變址(index):存放在變址暫存器中的內容。通常用來訪問陣列中的某個元素或字串的某個字元。

比例因子(scale factor):是386新增加的定址方式的術語,值可為1,2,4,8在定址中,可用變址暫存器內容乘以比例因子來取得變址值。

有效地址的計算公式可用由以下來處理:

EA = 基址 + (變址 X 比例因子) + 位移量

除了比例因子固定,其它三個都可以有正負。

四種成分16位定址32位定址
位移量 0,8,16位 0,8,32位
基址暫存器 BX,BP 任何32位通用暫存器
變址暫存器 SI,DI 除ESP外的32位通用暫存器
比例因子 1,2,4,8

表格一

預設段選擇規則

訪存型別所用段及段暫存器卻省選擇規則
指令 程式碼段 CS暫存器 用於取指
堆疊 堆疊段 SS暫存器 所有的堆疊的進棧和出棧,任何用ESP或EBP作為基址暫存器的訪問
區域性資料 資料段 DS暫存器
除相對於堆疊以及串處理指令的目的以外的所有資料訪問
目的串 附加資料段 ES暫存器 串處理指令的目的串

表格二

3 直接定址方式

運算元的有效地址只包含位移量這一種成分。值就在程式碼段中指令的操作碼之後。也就是位移量就是運算元的有效地址。

;假設(ds) = 3050H
mov ax,[0000] ;就是把記憶體在3050:0000記憶體的資料傳送到ax中
也可以用符號地址代替數值地址比如
mov ax,[VALUE];就是把value的3050:value將value替換為資料跟上一樣


也可以用指定段暫存器來作為段地址也是可以的。

mov ax,es:value
mov ax,es:[value]

4 暫存器間接定址方式

運算元的有效地址只包含基址暫存器或變址暫存器的一種,有效地址就在某個暫存器裡。如表格一所示在16位定址時可用的基址暫存器位BP和BX,變址暫存器位SI和DI。在32位定址時可用使用EAX,EBX,ECX,EDX,ESP,EBP等BSI,EDI等八個通用暫存器。凡是使用BP,ESP和EBP的預設段位SS,其它暫存器的預設段位DS暫存器。

;例子
;(DS) = 2000H (BX) = 1000H
mov ax,[bx]
;則實體地址等於2000*16+bx=21000
;則就是把地址位於21000的資料送給ax中

同樣也可以跨越前端來處理

mov ax,es:[bx] ;也是可以處理的

5 暫存器相對定址方式(register relative addressing)

運算元的有效地址為基址暫存器或變址暫存器的內容和指令中指定的位移量之和。

EA(有效地址)= (base(基址)||index(變址)) +displacement (位移量)

;例子
mov ax,count[si]
;和mov ax,[count+si]是一個意思
;同樣也可以使用跨段來訪問
mov dl,es:string[si]

6 基址變址定址方式

運算元的有效地址是一個基址暫存器和一個變址暫存器的內容之和。

EA = base + index

mov ax,[bx][di]
;或者
mov ax,[bx+di]
;同樣可以使用段跨越字首
mov ax,es:[bx][si]

7 相對基址變址定址方式

EA = base + index +displacement

mov ax,mask[bx][si]
;也可以寫成
mov ax,mask[bx+si]
;或者
mov ax,[mask+bx+si]

這種定址方式常用來對於二維陣列的定址。

8 比例變址定址方式(scaled indexed addressing)

EA = displacement + index*比例

;例子
mov ecx,count[esi*4]

9 基址比例變址定址方式(based scaled indexed addressing)

運算元的有效地址是變址暫存器*比例因子加上基址

EA = base+index*比例因子

MOV ECX,[EAX][EDX+8]

10 相對基址比例變址定址方式

EA = base+index*比例因子+displacement

MOV EAX,TABLE[EBP][EDI*4]

與地址有關的定址方式

1 段內直接定址

轉向的有效地址是當前IP暫存器的內容和指令中指定的8位或16位位移量之和

這種方式的轉向有效地址用相當於當前IP值的位移量來表示。位移量是轉向的有效地址與當前IP值之差。當這一段程式在記憶體中的不同區域執行時,之中定址方式的轉移指令本身不會發生變化。這種定址方式適用於條件轉移和無條件轉移指令。但是當用於條件轉移指令時,位移量只允許8位(386和後繼機型可以為8位或32位)

無條件轉移指令在位移量為8時稱為短跳轉,位移量為16時稱為近跳轉。

指令格式:

JMP NEAR PTR PROGIA
JMP SHORT QUEST
;在彙編指令中如果位移量為16位則在符號地址前加操作符NEAR PTR
;如果位移量為8位,就在前面新增操作符SHORT

2 段內間接定址(intrasegment indirect addressing)

轉向有效地址是一個個暫存器或者是一個儲存單元的內容,這個暫存器或儲存單元的內容可以用資料定址方式中除立即數以外的任何一種定址方式取得。所得到的轉向的有效地址用來取代IP暫存器的內容。

這種定址方式和下面的兩種都不能用在條件轉移指令上。也就是條件轉移指令只能使用段內直接定址的8位位移量(當然在386以及後面的機型中執行8位或32位位移量)JMP和CALL指令可用四種定址方式的任何一種。

;段內間接定址方式的彙編格式
JMP BX
JMP WORD PTR[BP+TABLE]
;裡面的WORD PTR是操作符,用以指出後面的定址方式所取得的轉地址是一個字的有效地址

段內間接定址和段內直接定址都是段內轉移,直接把求得的轉向有效地址送到IP暫存器裡。

;假設DS=2000,BX=1256,SI=528F
;位移量=20A1H (232F7)=3280 (264E5) = 2450

JMP BX;執行指令後IP=1256

JMP TABLE[BX] ;執行指令後IP=(16*DS+BX+位移量)=232F7

JMP [BX][SI];執行指令後ip = (16xDS+BX+SI) = 2450

3 段間直接定址

在指令中直接提供轉向段地址和偏移地址,只要用指令中指定的偏移地址取代IP暫存器的內容,用指令中指定的段地址取代CS暫存器的內容,就完成了一個從一個段到另一個段的轉移操作。

;指令的組合語言格式可表示位
JMP FAR PTR NEXTROUTINT
;其中,NEXTROUTINT為轉向的符號地址,FAR PTR則是表示段間轉移的操作符

4 段間間接定址(intersegment indirect addressing)

用儲存器中的兩個相繼字的內容來取代IP和CS暫存器中的原始內容,以達到段間轉移的目的。這裡,儲存單元的地址是由指令指定除立即數方式和暫存器方式意外的任何一種資料定址方式獲得。

;這種指令的組合語言格式可以表示為
JMP DWORD PTR[INTERS+BX]
;其中[INTERS+BX]說明資料定址方式為直接變址定址方式,DWORD PTR為雙字操作符,說明轉向地址需取雙字為段間轉移指令。