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為雙字操作符,說明轉向地址需取雙字為段間轉移指令。