80X86定址方式總結

2021-04-06 23:45:54 字數 4086 閱讀 5327

一:概論

擇子存放在六個段暫存器(cs,ss,ds,es,fs,gs)中:

**段總是由 cs 段暫存器來指示;

堆疊段總是由 ss 段暫存器來指示;

字元處理指令總是使用 es 段暫存器作為目標運算元的段暫存器;

一般的資料段可用 ds、es、fs、gs來指示,但 ds 作為資料段的預設段暫存器,用它來定址比其它幾個段暫存器的效率高,因此最好安排 ds 定址最常引用的資料段,而 es、fs、gs去定址一些不常用的資料段。

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

80X86定址方式總結

80x86定址方式總結 sandrain zeq的專欄 部落格頻道 csdn.net 一 概論 擇子存放在六個段暫存器 cs,ss,ds,es,fs,gs 中 段總是由 cs 段暫存器來指示 堆疊段總是由 ss 段暫存器來指示 字元處理指令總是使用 es 段暫存器作為目標運算元的段暫存器 一般的資料...

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 暫存器定址方式 暫存器定址...