一:概論
80x86匯編程序都是分段程序設(shè)計結(jié)構(gòu),每個程序段都有一個開始地址:段基址。在保護模式下段基址要由16位的段選擇子得到,這些段選
擇子存放在六個段寄存器(CS,SS,DS,ES,F(xiàn)S,GS)中:
代碼段總是由 CS 段寄存器來指示;
堆棧段總是由 SS 段寄存器來指示;
字符處理指令總是使用 ES 段寄存器作為目標操作數(shù)的段寄存器;
一般的數(shù)據(jù)段可用 DS、ES、FS、GS來指示,但 DS 作為數(shù)據(jù)段的默認段寄存器,用它來尋址比其它幾個段寄存器的效率高,因此最好安排 DS 尋址最常引用的數(shù)據(jù)段,而 ES、FS、GS去尋址一些不常用的數(shù)據(jù)段。
段內(nèi)偏移地址(某個字節(jié)相對段基址的偏移量)也被稱為有效地址 EA(effective address),它由以下4個部分組成:
EA = 基址 + (變址 * 比例因子) + 位移量
基址、變址、位移量的值可正可負,比例因子只能為正。
1:基址
(32位尋址):
1):如果基址寄存器是 ESP或EBP,則段寄存器為 SS;
2):如果基址寄存器是其它通用寄存器,則段寄存器為 DS;
(16位尋址):
基址寄存器可以是 BX 或 BP
2:變址
(32位尋址):
變址寄存器可以為除 ESP 之外的32位通用寄存器
(16位尋址):
變址寄存器可以是 SI 或 DI
3:比例因子
一個常數(shù),可取 1、2、4、8。
4:位移量
一個8位、16位、32位的常數(shù)。
二:詳解
默認情況下,存儲器尋址使用DS數(shù)據(jù)段,可以使用段寄存器來顯式指出選擇的段。
1:立即尋址
對多字節(jié)立即數(shù),高字節(jié)放在寄存器高位,低字節(jié)放在寄存器低位。
例:
MOV BL,43 ;把十進制數(shù)43放入BL中
MOV AX,98H ;把十六進制數(shù)98H放入AX中
MOV AL,'A' ;把字符'A'的ASCII碼放入AL中
MOV CX,'AB' ;把字符'AB'的ASCII碼放入CX中
2:寄存器尋址
指令中必須是同長的寄存器
3:直接尋址
指令中直接提供源操作數(shù)的偏移地址,它作為代碼的一部分存放在代碼段中。
例:
MOV BL,DS:[00300H] ;把DS數(shù)據(jù)段中偏移地址為300H的字節(jié)復(fù)制到BL
MOV CX,ES:[00300H] ;把ES數(shù)據(jù)段中偏移地址為300H的字復(fù)制到CX
MOV EAX,DwordVar ;把DS數(shù)據(jù)段中DwordVar單元復(fù)制到EAX
MOV CL,ByteVar ;把DS數(shù)據(jù)段中ByteVar單元復(fù)制到CL
4: 寄存器間接尋址
操作數(shù)的有效地址存放在指令指明的寄存器中,能夠用作間接尋址的寄存器有:
EAX,EBX,ECX,EDX,ESI,EDI --> 使用 DS 作為段寄存器
ESP,EBP --> 使用 SS 作為段寄存器
例:
LEA EBX, ARRAY ;把數(shù)組開始地址送EBX
MOV AL, [EBX] ;訪問數(shù)組的第0個元素,若要訪問其它元素,只需增加數(shù)組索引EBX的值
MOV AX, [EBP] ;把SS段中EBP指向的字單元復(fù)制到 AX
MOV [EBP], AX ;把AX的值復(fù)制到SS段中EBP指向的單元
MOV [EDI], AL ;把AL的值復(fù)制到DS段中EDI指向的單元
MOV AL, [EDX] ;把DS段中EDX指向的字節(jié)單元復(fù)制到 AL
5:寄存器相對尋址
有效地址EA等于寄存器R中的內(nèi)容與位移量X的和,即 EA = X + [R],該方式適用于數(shù)組、表格處理。
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的字存儲單元的內(nèi)容復(fù)制到 AX
MOV ARRAY[EDI], AL ;把AL的值復(fù)制到DS段中ARRAY中的第EDI字節(jié)單元中
MOV LIST[EDI+3], AX ;把AX的值復(fù)制到DS段中EDI+LIST+3的字單元中
MOV ARRAY[EBX],EAX ;把EAX的值復(fù)制到DS段中ARRAY+EBX的雙字單元中
6:基址變址尋址
ESP不能作為變址寄存器。匯編器按如下規(guī)則區(qū)分基址寄存器和變址寄存器:指令的第二操作數(shù)中的第一個寄存器為基址寄存器,第二
個寄存器為變址寄存器。比如 MOV EAX, [EDX][ESI](或MOV EAX, [EDX+ESI])中,EDX 為基址寄存器,ESI 為變址寄存器。該方式適用
于數(shù)組、表格的處理。
例:
MOV AX, [EBX+ESI] ;DS段中地址為EBX+ESI的存儲單元的字數(shù)據(jù)送AX
MOV AX, [EBP+ESI] ;SS段中地址為EBP+ESI的存儲單元的字數(shù)據(jù)送AX
MOV AX, ES:[EBX+ESI] ;ES段中地址為EBX+ESI的存儲單元的字數(shù)據(jù)送AX
7:相對基址變址尋址
該方式適用于二維數(shù)組的尋址。
EA = X + [BP] + [IR]
例:
MOV AX, Disp[EBX][EDI] 或
MOV AX, Disp[EBX+EDI] 或
MOV AX, [Disp+EBX+EDI]
以下三種方式中,任何32位通用寄存器都能用作基址寄存器,除ESP之外的32位通用寄存器均可作為變址寄存器;
若比例因子為1,指令的第二操作數(shù)中的第一個寄存器為基址寄存器,第二個寄存器為變址寄存器。若基址寄存器為EBP或ESP,則默認的段寄存器是SS;若基址寄存是其它的寄存器,則默認的段寄存器是DS。
若比例因子為2、4、8,則與比例因子相乘的那個寄存器是變址寄存器。
8:比例變址尋址方式
EA = X + [IR * K]
和寄存器相對尋址相比增加了比例因子,優(yōu)點在于:對元素大小為2、4、8字節(jié)的數(shù)組,可在變址寄存器中給出數(shù)組元素的下標。
例:
MOV EAX, ARRAY[ESI*4] ;將ARRAY數(shù)組中第 (ESI) 個元素送EAX,其中ARRAY數(shù)組中元素大小為4
9:基址比例變址尋址
EA = [BR] + [IR * K]
例:
LEA EBP, ARRAY ;把數(shù)組開始地址送EBX
MOV EAX, [EBP][ESI*4] ;將ARRAY數(shù)組中第 (ESI) 個元素送EAX,其中ARRAY數(shù)組中元素大小為4
10:相對基址比例變址尋址
EA = X + [BR] + [IR * K]
例:
MOV AL, 0040400H[EBX][ESI*2]
MOV [EAX+EDI*2+15H], DX ; 把DX寄存器的內(nèi)容復(fù)制到數(shù)據(jù)段的一存儲單元,
; 該存儲單元EA = EAX+EDI*2+15H
MOV AL, [EBP+ESI*2-30H] ; 把堆棧中的一字節(jié)單元的內(nèi)容復(fù)制到AL中,
; 該存儲單元EA = EBP+ESI*2-30H
聯(lián)系客服