80X86定址方式與常見彙編指令
阿新 • • 發佈:2019-02-03
1、指令
指令:操作碼和運算元組成(不定有運算元);
操作碼:執行操作,用一個唯一的助記符表示,對應著機器指令的一個二進位制編碼;
運算元:操作物件,可以是數值,暫存器或儲存器地址;
助記符格式:
操作碼 目的運算元,源運算元;註釋
指令運算元:
r8:任一8位通用暫存器;
r16:任一16位通用暫存器;
reg:r8 或 r16;
seg:段暫存器(CS/SS/DS/ES);
m8:8位儲存器運算元單元;
m16::16位儲存器運算元單元;
mem:m8 或 m16;
i8:8位立即數;
i16:16位立即數;
imm:i8 或 i16;
dest:目的運算元;
src:源運算元;
同一定址方式的不同表達:
MOV AX,[BX][SI] ;等同 MOV AX,[BX+SI]
MOV AX,15[SI] ;等同 MOV AX,[15+SI]
MOV AX,15[BX][SI] ;等同 MOV AX,15[BX+SI] 或 MOV AX,[15+BX+SI]
2、定址方式
分為3種定址方式:
立即數定址:指令中運算元直接放在機器程式碼中,緊跟操作碼之後,常用來給暫存器賦值;
暫存器定址:運算元存放在暫存器中,可以是r8,r16,seg;
儲存器定址:指令中給出運算元的偏移地址,而段地址在預設的或段超越字首指定的段暫存器中;
定址方式:
a.直接定址:有效地址在指令中直接給出,預設段地址在DS中,可使用段超越字首改變;
b.暫存器間接定址:有效地址存放在基址暫存器BX或變址暫存器SI、DI中,段地址同上;
c.暫存器相對定址:有效地址是暫存器內容與i8或i16之和,暫存器可為BX、BP、SI、DI,
段地址對應BX/SI/DI暫存器預設是DS,對應BP暫存器預設為SS,可使用段超越字首改變;
d.基址變址定址:有效地址由基址暫存器(BX/BP)內容加上變址暫存器(SI/DI)內容構成,
段地址對應BX預設為DS,對應BP預設為SS,可使用段超越字首改變;
e.相對基址變址定址:有效地址由基址暫存器(BX/BP)、變址暫存器(SI/DI)與i8或i16構成,
段地址對應BX預設為DS,對應BP預設為SS,可使用段超越字首改變;
棧:
主存區域,位於堆疊段中,邏輯上存在,遵循後進先出(LIFO) 或 先進後出(FILO),段地址在SS段暫存器中;
特徵:
a.只有一個出口,即當前棧頂,用堆疊指標暫存器SP指定,SS:SP指向當前棧的棧頂;
b.棧頂是地址較小一端,棧底為高地址端;
c.棧操作均以字為單位進行;
d.字量資料從棧頂壓入和彈出時,低地址送低位元組,高地址送高位元組;
e.每個函式均開闢屬於自己的棧幀;
f.雖遵循先進後出原則,但也可用儲存器定址方式隨機存取棧中的資料;
用途:
a.臨時存放資料
b.傳遞引數
c.儲存和恢復暫存器
操作:
PUSH:進棧指令先使堆疊指標SP減2,然後將一個字運算元放入堆疊頂部;
POP :出棧指令將棧頂的一個字傳送到指定的目的運算元,然後堆疊指標SP加2;
PUSH r16/m16/reg
POP r16/m16/reg
3、彙編指令
資料傳輸指令:
MOV:移動資料
PUSH:入棧
POP:出棧
XCHG:交換
LEA:有效地址傳送
PUSHF/POPF:標誌暫存器進棧/出棧
PUSHA/POPA:暫存器狀態壓入/彈出堆疊
算數與邏輯運算指令:
ADD:加法
ADC:帶進位加法(額外加上CF標誌,上一條指令結果影響)
INC:加1(CF標誌不變,其它狀態標誌均受影響)
SUB:減法
SBB:帶借位減法(額外減去CF標誌,上一條指令結果影響)
DEC:減1(CF標誌狀態不變)
MUL:無符號乘法(單運算元,目標運算元為AL、AX或EAX中的隱式運算元)
IMUL:有符號乘法(單運算元、雙運算元、三運算元3種,任何一種都是兩個運算元參與運算);
DIV:無符號除法(單運算元,目標運算元為AX/DX:AX/EDX/EAX);
IDIV:有符號除法(單運算元,目標運算元為AL/AX/EAX中的值,結果存入AX/DX:AX/EDX:EAX,防止溢位)
CMP:比較(實際上為減,不儲存結果,根據結果設定EFLAGS中的狀態標誌);
AND:邏輯與(逐位與)
OR:邏輯或(逐位或)
XOR:邏輯異或(逐位異或)
NOT:邏輯非(逐位非)
TEST:邏輯比較(逐位與,根據結果設定SF、ZF、PF,丟棄結果)
串操作指令:
MOVS:串傳送
STOS:存入串(STOSB/STOSW/STOSD,將AL/AX/EAX中的位元組/字/雙字存入目標運算元);
LODS:取出串(LODSB/LODSW/LODSD,將源運算元中的位元組/字/雙字載入到AL/AX/EAX);
CMPS:串比較(CMPB/CMPW/CMPD,比較運算元指定的位元組/字/雙字,根據結果設定EFLAGS中的狀態標識);
REP:重複操作字首(REP/REPE/REPNE,按CX指定的次數重複執行字串指令,或是ZF標識不再滿足指定的條件為止)
重複條件:
REP :CX!=0;
REPE :CX!=0 且 ZF==1;
REPNE :CX!=0 且 ZF!=1;
控制轉移指令:
JMP :無條件轉移,跳轉到指定目標地址處,從目標地址處開始執行;
Jcc :有條件轉移
LOOP:迴圈
CALL :函式呼叫(CS : IP入棧,跳轉)
RET :返回(帶一個立即數 i16,堆疊指標SP增加,清除執行CALL前入棧的引數,即平衡堆疊);
三種轉移方式:
短轉移(short):段內轉移,在段內 -128~+127範圍內轉移,即在一個位元組之內;
近轉移(near):段內轉移,在當前程式碼段64KB範圍內轉移,無需更改CS段地址,只需改變IP偏移地址;
遠轉移(far):段間轉移,在1MB範圍內,需要更改CS段地址和IP偏移地址;
目標地址必須用一個32位數表達,稱為32位遠指標,是一個邏輯地址;
實際程式設計時,彙編程式會根據目標地址的距離,自動處理成短轉移、近轉移或遠轉移;
當然,我們也可以使用short/near ptr/far ptr 強制轉移。