80x86定址方式總結 - sandrain_zeq的專欄 - 部落格頻道 - csdn.net
一:概論
擇子存放在六個段暫存器(cs,ss,ds,es,fs,gs)中:
**段總是由 cs 段暫存器來指示;
堆疊段總是由 ss 段暫存器來指示;
字元處理指令總是使用 es 段暫存器作為目標運算元的段暫存器;
一般的資料段可用 ds、es、fs、gs來指示,但 ds 作為資料段的預設段暫存器,用它來定址比其它幾個段暫存器的效率高,因此最好安排 ds 定址最常引用的資料段,而 es、fs、gs去定址一些不常用的資料段。
段內偏移位址(某個位元組相對段基址的偏移量)也被稱為有效位址 ea(effective address),它由以下4個部分組成:
ea = 基址 + (變址 * 比例因子) + 位移量
基址、變址、位移量的值可正可負,比例因子只能為正。
1:基址
(32位定址):
1):如果基址暫存器是 esp或ebp,則段暫存器為 ss;
2):如果基址暫存器是其它通用暫存器,則段暫存器為 ds;
(16位定址):
基址暫存器可以是 bx 或 bp
2:變址
(32位定址):
變址暫存器可以為除 esp 之外的32位通用暫存器
(16位定址):
變址暫存器可以是 si 或 di
3:比例因子
乙個常數,可取 1、2、4、8。
4:位移量
乙個8位、16位、32位的常數。
二:詳解
預設情況下,儲存器定址使用ds資料段,可以使用段暫存器來顯式指出選擇的段。
1:立即定址
對多位元組立即數,高位元組放在暫存器高位,低位元組放在暫存器低位。
例:mov bl,43 ;把十進位制數43放入bl中
mov ax,98h ;把十六進製制數98h放入ax中
mov al,'a' ;把字元'a'的ascii碼放入al中
mov cx,'ab' ;把字元'ab'的ascii碼放入cx中
2:暫存器定址
指令中必須是同長的暫存器
3:直接定址
指令中直接提供源運算元的偏移位址,它作為**的一部分存放在**段中。
例:mov bl,ds:[00300h] ;把ds資料段中偏移位址為300h的位元組複製到bl
mov cx,es:[00300h] ;把es資料段中偏移位址為300h的字複製到cx
mov eax,dwordvar ;把ds資料段中dwordvar單元複製到eax
mov cl,bytevar ;把ds資料段中bytevar單元複製到cl
4: 暫存器間接定址
運算元的有效位址存放在指令指明的暫存器中,能夠用作間接定址的暫存器有:
eax,ebx,ecx,edx,esi,edi --> 使用 ds 作為段暫存器
esp,ebp --> 使用 ss 作為段暫存器
例:lea ebx, array ;把陣列開始位址送ebx
mov al, [ebx] ;訪問陣列的第0個元素,若要訪問其它元素,只需增加陣列索引ebx的值
mov ax, [ebp] ;把ss段中ebp指向的字單元複製到 ax
mov [ebp], ax ;把ax的值複製到ss段中ebp指向的單元
mov [edi], al ;把al的值複製到ds段中edi指向的單元
mov al, [edx] ;把ds段中edx指向的位元組單元複製到 al
5:暫存器相對定址
有效位址ea等於暫存器r中的內容與位移量x的和,即 ea = x + [r],該方式適用於陣列、**處理。
eax,ebx,ecx,edx,esi,edi --> 使用 ds 作為段暫存器
esp,ebp --> 使用 ss 作為段暫存器
例:mov ax, table[esi] ;table中存放表的首位址,esi存放要訪問的表項的索引
mov ax, [table + esi] ;(mov ax, [table + esi]) == (mov ax, table[esi])
mov ax, 100h[esi] ;把ds段中esi加100h的字儲存單元的內容複製到 ax
mov array[edi], al ;把al的值複製到ds段中array中的第edi位元組單元中
mov list[edi+3], ax ;把ax的值複製到ds段中edi+list+3的字單元中
mov array[ebx],eax ;把eax的值複製到ds段中array+ebx的雙字單元中
6:基址變址定址
esp不能作為變址暫存器。彙編器按如下規則區分基址暫存器和變址暫存器:指令的第二運算元中的第乙個暫存器為基址暫存器,第二
個暫存器為變址暫存器。比如 mov eax, [edx][esi](或mov eax, [edx+esi])中,edx 為基址暫存器,esi 為變址暫存器。該方式適用
於陣列、**的處理。
例:mov ax, [ebx+esi] ;ds段中位址為ebx+esi的儲存單元的字資料送ax
mov ax, [ebp+esi] ;ss段中位址為ebp+esi的儲存單元的字資料送ax
mov ax, es:[ebx+esi] ;es段中位址為ebx+esi的儲存單元的字資料送ax
7:相對基址變址定址
該方式適用於二維陣列的定址。
ea = x + [bp] + [ir]
例:mov ax, disp[ebx][edi] 或
mov ax, disp[ebx+edi] 或
mov ax, [disp+ebx+edi]
以下三種方式中,任何32位通用暫存器都能用作基址暫存器,除esp之外的32位通用暫存器均可作為變址暫存器;
若比例因子為1,指令的第二運算元中的第乙個暫存器為基址暫存器,第二個暫存器為變址暫存器。若基址暫存器為ebp或esp,則預設的段
暫存器是ss;若基址寄存是其它的暫存器,則預設的段暫存器是ds。
若比例因子為2、4、8,則與比例因子相乘的那個暫存器是變址暫存器。
8:比例變址定址方式
ea = x + [ir * k]
和暫存器相對定址相比增加了比例因子,優點在於:對元素大小為2、4、8位元組的陣列,可在變址暫存器中給出陣列元素的下標。
例:mov eax, array[esi*4] ;將array陣列中第 (esi) 個元素送eax,其中array陣列中元素大小為4
9:基址比例變址定址
ea = [br] + [ir * k]
例:lea ebp, array ;把陣列開始位址送ebx
mov eax, [ebp][esi*4] ;將array陣列中第 (esi) 個元素送eax,其中array陣列中元素大小為4
10:相對基址比例變址定址
ea = x + [br] + [ir * k]
例:mov al, 0040400h[ebx][esi*2]
mov [eax+edi*2+15h], dx ; 把dx暫存器的內容複製到資料段的一儲存單元,
; 該儲存單元ea = eax+edi*2+15h
mov al, [ebp+esi*2-30h] ; 把堆疊中的一位元組單元的內容複製到al中,
; 該儲存單元ea = ebp+esi*2-30h
參考資料:<win32組合語言程式設計教程> 機械工業出版社 嚴義、包健、周尉等編著
80X86定址方式總結
一 概論 擇子存放在六個段暫存器 cs,ss,ds,es,fs,gs 中 段總是由 cs 段暫存器來指示 堆疊段總是由 ss 段暫存器來指示 字元處理指令總是使用 es 段暫存器作為目標運算元的段暫存器 一般的資料段可用 ds es fs gs來指示,但 ds 作為資料段的預設段暫存器,用它來定址比...
80X86定址方式
1 與定址相關的暫存器 8086 暫存器 段暫存器cs ds es ss 基址暫存器bx bp 變址暫存器di si 專用暫存器ip sp 具體每個暫存器的作用就不仔細介紹了。80386 及其以上的暫存器 段暫存器cs ds es ss fs,gs 基址暫存器eax ebx ecx edx ebp ...
組合語言 80x86定址方式
1 立即定址方式 立即定址方式中指令的運算元是8位或16位立即數,並直接出現在指令中。例如 mov al,10h 源運算元為立即定址 執行後al 10h mov ax,0a48h 源運算元為立即定址 執行後ax 0a48h 立即定址只能用於源運算元,不能用於目的運算元。2 暫存器定址方式 暫存器定址...