x86彙編指令詳解
80x86指令系統
80x86指令系統,指令按功能可分為以下七個部分。
(1) 資料傳送指令。
(2) 算術運算指令。
(3) 邏輯運算指令。
(4) 串操作指令。
(5) 控制轉移指令。
(6) 處理器控制指令。
(7) 保護方式指令。
3.3.1資料傳送指令
資料傳送指令包括:通用資料傳送指令、地址傳送指令、標誌暫存器傳送指令、符號擴充套件指令、擴充套件傳送指令等。
一、通用資料傳送指令
1傳送指令
傳送指令是使用最頻繁的指令,格式:MOV DEST,SRC
功能:把一個位元組,字或雙字從源運算元SRC傳送至目的運算元DEST。
傳送指令允許的資料流方向見圖311。
圖 3.11 傳送指令資料流
由上圖可知,資料允許流動方向為:通用暫存器之間、通用暫存器和儲存器之間、通用暫存器和段暫存器之間、段暫存器和儲存器之間,另外還允許立即數傳送至通用暫存器或儲存器。但在上述傳送過程中,段暫存器CS的值不能用傳送指令改變。
例 3.12CPU內部暫存器之間的資料傳送。
MOV AL,DH ;AL←DH (8位)
MOV DS,AX ;DS←AX (16位)
MOV EAX,ESI ;EAX←ESI (32位)
例 3.13CPU內部暫存器和儲存器之間的資料傳送。
MOV [BX],AX ;間接定址 (16位)
MOV EAX,[EBX+ESI] ;基址變址定址 (32位)
MOV AL,BLOCK ;BLOCK為變數名,直接定址(8位)
例 3.14
MOV EAX,12345678H ;EAX←12345678H (32位)
MOV [BX],12H ;間接定址 (8位)
MOV AX,1234H;AX←1234H(16位)
使用該指令應注意以下問題:
·源和目的運算元不允許同時為儲存器運算元;
·源和目的運算元資料型別必須一致;
·源和目的運算元不允許同時為段暫存器;
·目的運算元不允許為CS和立即數;
·當源運算元為立即數時,目的運算元不允許為段暫存器;
·傳送操作不影響標誌位。
2擴充套件傳送指令
格式:MOV SX DEST,SRC
MOV ZX DEST,SRC
功能:將源運算元由8位擴充套件到16位送目的運算元,或由16位擴充套件到32位送目的運算元。其中MOVSX是按有符號數擴充套件,MOVZX是按無符號數擴充套件。無符號數或正數高位擴充套件為0,負數高位擴充套件為全“1”。
例 3.15
MOV BL,80H ; -128
MOVSX AX,BL ; 將80H擴充套件為FF80H後送AX中。
例 3.16無符號數擴充套件
MOV BL,80H ; 128
MOVZX AX,BL ; 將80H擴充套件為0080H後送AX中。
使用該指令應注意以下問題:
·目的運算元應為16位或32位通用暫存器;
·源運算元長度須小於目的運算元長度,為8位或16位通用暫存器或儲存器運算元;
·擴充套件傳送操作不影響標誌位。
3交換指令
(1) 格式:XCHG OPR1,OPR2
功能:交換運算元OPR1和OPR2的值,運算元資料型別為位元組、字或雙字。允許通用暫存器之間,通用暫存器和儲存器之間交換資料。
例 3.17
XCHG AX,BX;通用暫存器之間交換資料(16位)
XCHG ESI,EDI;通用暫存器之間交換資料(32位)
XCHG BX,/[SI/];通用暫存器和儲存器之間交換資料(16位)
XCHG AL,/[BX/];通用暫存器和儲存器之間交換資料(8位)
使用該指令應注意以下問題:
·運算元OPR1和OPR2不允許同為儲存器運算元;
·運算元資料型別必須一致;
·交換指令不影響標誌位。
如要實現儲存器運算元交換,可用如下指令實現:
MOV AL,BLOCK1
XCHG AL,BLOCK2
MOV BLOCK1,AL
(2) 格式:BSWAP REG
功能:將32位通用暫存器中,第1個位元組和第4個位元組交換,第2個位元組和第3個位元組交換。
例 3.18
MOV EAX,44332211H
BSWAP EAX;EAX=11223344H
使用該指令應注意以下問題:
·運算元為32位通用暫存器;
·交換指令不影響標誌位。
二、堆疊操作指令
1壓棧指令
(1) 格式:PUSH SRC
功能:將源運算元壓下堆疊,源運算元允許為16位或32位通用暫存器、儲存器和立即數以及16位段暫存器。當運算元資料型別為字型別,壓棧操作使SP值減2;當資料型別為雙字型別,壓棧操作使SP值減4。
例 3.19
PUSH AX ;通用暫存器運算元入棧(16位)
PUSH EBX ;通用暫存器運算元入棧(32位)
PUSH [SI] ;儲存器運算元入棧(16位)
PUSH DWORD PTR [DI] ;儲存器運算元入棧(32位)
PUSHW 0A123H ;立即數入棧(16位)
PUSHD 20H ;立即數入棧(32位)
(2) 格式:PUSHA
PUSHAD
功能:PUSHA將16位通用暫存器壓入堆疊,壓棧順序為AX,CX,DX,BX,SP,BP,SI,DI。
PUSHAD將32位通用暫存器壓入堆疊,壓棧順序為EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
2出棧指令
(1) 格式:POP DEST
功能:從棧頂彈出運算元送入目的運算元。目的運算元允許為16或32位通用暫存器、儲存器和16位段暫存器。當運算元資料型別為字型別,出棧操作使SP加2;當運算元資料型別為雙字型別,出棧操作使SP加4。
例 3.20
POP AX ;操作數出棧送暫存器(16位)
POP ECX ;操作數出棧送暫存器(32位)
POP [BX] ;操作數出棧送儲存器(16位)
POP DWORD PTR [SI] ;操作數出棧送儲存器(32位)
(2) 格式:POPA
POPAD
功能:POPA從堆疊移出16位元組資料,並且按順序存入暫存器DI,SI,BP,SP,BX,DX,CX,AX中。
POPAD從堆疊移出32位元組資料,並且按順序存入暫存器EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中。
使用堆疊操作指令應注意以下問題。
(1) 目的運算元不允許為CS以及立即數。
(2) 堆疊操作指令不影響標誌位。
三、地址傳送指令
(1) 格式:LEA REG,MEM
功能:將源運算元的有效地址傳送到通用暫存器,運算元REG為16位或32位通用暫存器,源運算元為16位或32位儲存器運算元。
例 3.21
LEA BX,BLOCK;將BLOCK的有效地址傳送到BX中(16位)
LEA EAX,/[EBX/];將EBX內容(有效地址)傳送到EAX中(32位)
(2) 格式LDS(ES,FS,GS,SS)REG,MEM
功能:根據源運算元指定的偏移地址,在資料段中取出段地址和偏移地址分別送指定的段暫存器和指定的通用暫存器。
例 3.22
LES BX,[SI] ;將32位地址指標分別送ES和BX
LSS EAX,[EDI] ;將48位地址指標分別送SS和EAX
例 3.23
DATA1 DD buff
LDS BX,DATA1;將buff的32位地址指標分別送DS和BX
地址傳送指令對標誌位無影響。
四、標誌暫存器傳送指令
(1) 格式:LAHF
SAHF
功能:LAHF將標誌暫存器中低8位送AH中。SAHF將AH中內容送標誌暫存器中低8位。
(2) 格式:PUSHF
POPF
功能:PUSHF將標誌暫存器低16位內容壓入堆疊,SP←SP-2。POPF將當前棧頂一個字傳送到標誌暫存器低16位中,SP←SP+2。
(3) 格式:PUSHFD
POPFD
功能:PUSHFD將標誌暫存器32位內容壓入堆疊SP←SP-4。POPFD將當前棧頂一個雙字傳送到32位標誌暫存器中,SP←SP+4。
上述SAHF,POPF,POPFD均影響相應的標誌暫存器內容。
五、查表指令
格式:XLAT
功能:將暫存器AL中的內容轉換成儲存器表格中的對應值。實現直接查表功能。
XLAT指令規定:BX暫存器存放表的首地址,AL暫存器中存放表內偏移量,執行XLAT指令,以段暫存器DS的內容為段基址,有效地址為BX和AL內容之和,取出表中一個位元組內容送AL中。
例 3.24記憶體中有一起始地址為TABLE的編碼表,試程式設計將表中順序號為4的儲存單元內容送暫存器AL。
·MODEL SMALL
·DATA
TABLE DB 11H,22H,33H,44H,55H 某編碼表
·CODE
·STARTUP
MOV AL,4 ;AL←4
MOV BX,OFFSET TABLE ;BX←TABLE表首地址
XLAT ;結果在AL中,AL=55H
·EXIT
END
查表指令不影響標誌位。
六、符號擴充套件指令
(1) 格式:CBW
功能:將AL中8位帶符號數,進行帶符號擴充套件為16位,送AX中。帶符號擴充套件是指對正數高位擴充套件為全“0”,對負數高位擴充套件為全“1”。
例 3.25AL=55H 經CBW擴充套件後 AX=0055H
AL=A5H 經CBW擴充套件後 AX=FFA5H
(2) 格式:CWD
功能:將AX中16位帶符號數,進行帶符號擴充套件為32位,送DX和AX中。高16位送DX中,低16位送AX中。
(3) 格式:CWDE
功能:將AX中16位帶符號數,進行帶符號擴充套件為32位,送EAX中。
(4) 格式:CDQ
功能:將EAX中32位帶符號數,進行帶符號擴充套件為64位,送EDX和EAX中。低32位送EAX中,高32位送EDX中。
符號擴充套件指令對標誌位無影響。
3.3.2 算術運算指令
80x86指令包括加、減、乘、除四種基本算術運算操作及十進位制算術運算調整指令。二進位制加、減法指令,帶符號運算元採用補碼錶示時,無符號數和帶符號資料運算可以使用相同的指令。二進位制乘、除法指令分帶符號數和無符號數運算指令。
一、加法指令
格式:ADDDEST,SRC
ADCDEST,SRC
功能:ADD是將源運算元與目的運算元相加,結果傳送到目的運算元。ADC是將源運算元與目的運算元以及CF(低位進位)值相加,結果傳送到目的運算元。
源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
ADD,ADC指令影響標誌位為OF,SF,ZF,AF,PF,CF。
例 3.26
MOV AX,9876H
ADD AH,AL;AX=0E76H CF=1 SF=0O F=0 ZF=0 AF=0 PF=0
ADC AH,AL;AX=8576H CF=0 SF=1O F=1 ZF=0 AF=1 PF=0
二、減法指令
格式:SUB DEST,SRC
SBB DEST,SRC
功能:SUB將目的運算元減源運算元,結果送目的運算元。SBB將目的運算元減源運算元,還要減CF(低位借位)值,結果送目的運算元。
源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
SUB,SBB指令影響標誌位為OF,SF,ZF,AF,PF,CF。
例 3.27
MOV AX, 9966H;AX=9966H
SUB AL, 80H;AL=E6HCF=1SF=1OF=1ZF=0AF=0PF=0
SBB AH, 80H;AH=18HCF=0SF=0OF=0ZF=0AF=0PF=1
三、加1減1指令
格式:INC DEST
DEC DEST
功能:INC指令將目的運算元加1,結果送目的運算元。DEC指令將目的運算元減1,結果送目的運算元。目的運算元為通用暫存器或儲存器運算元。
INC,DEC指令影響標誌位為OF,SF,ZF,AF,PF。
例 3.28
INC BL;BL←BL+1
INC AX;AX←AX+1
INC WORDPTR [BX];儲存器運算元加1
DEC BYTE PTR [SI];儲存器運算元減1
DEC EAX;EAX←EAX-1
四、比較指令
(1) 格式:CMP DEST,SRC
功能:目的運算元減源運算元,結果不回送。源運算元為通用暫存器、儲存器和立即數。目的運算元為通用暫存器、儲存器運算元。
CMP指令影響標誌位為OF,SF,ZF,AF,PF,CF。
例 3.29
CMP CX,3
CMP WORD PTR [SI],3
CMP AX,BLOCK
執行比較指令後,對狀態標誌位影響見表3.2。對於兩個數的比較(AX-BX)有以下3種情況。
表 3.2 CMP指令對標誌位的影響
· 兩個正數比較,使用SF標誌位判斷。
SF=0,則AX≥BX,若ZF=1,則AX=BX
SF=1,則AX<BX
· 兩個無符號數比較,使用CF標誌位判斷。
CF=0,則AX≥BX,若ZF=1,則AX=BX
CF=1,則AX<BX
· 兩個負數比較,使用SF標誌位判斷。
SF=0,則AX≥BX,若ZF=1,則AX=BX
SF=1,則AX<BX
· 兩個異符號數比較。
如果OF=0,仍可用SF標誌判斷大小。
如果OF=1,說明結果的符號位發生錯誤,所以
SF=0,則AX<BX
SF=1,則AX>BX
綜上所述:兩個異號數比較
當OF=0,SF=0,則AX>BX
SF=1,則AX<BX
當OF=1,SF=0,則AX<BX
SF=1,則AX>BX
用邏輯表示式表示為:
若OF∨-SF=0,則AX>BX
若OF∨-SF=1,則AX<BX
(2) 格式:CMPXCHGDEST,REG
功能:目的運算元減源運算元,
如果DEST=SRC,則SRC→DEST。
如果DEST≠SRC,則DEST→ACC(AL,AX,EAX)。
源運算元允許為通用暫存器。目的運算元可以為通用暫存器,儲存器運算元。
CMPXCHG影響標誌位為OF,SF,ZF,AF,PF,CF。
(3) 格式:CMPXCHG8BMEM
功能:EDX:EAX中值減儲存器運算元。
如果EDX:EAX=MEM64,則ECX:EBX→MEM64。
如果EDX:EAX≠MEM64,則MEM64→EDX:EAX。
該指令為64位比較交換指令,影響ZF標誌位。
例 3.30 CMPXCHG8BQWORDPTR[EBX]
五、交換相加指令
格式:XADDDEST,REG
功能:目的運算元加源運算元,結果送目的運算元。原目的運算元內容送源運算元。源運算元允許為通用暫存器。目的運算元允許為通用暫存器、儲存器運算元。
XADD指令影響標誌位為OF,SF,ZF,AF,PF,CF。
六、求補指令
格式:NEGDEST
功能:對目的運算元求補,用零減去目的運算元,結果送目的運算元。目的運算元為通用暫存器、儲存器運算元。
NEG指令影響標誌位為OF,SF,ZF,AF,PF,CF。
七、乘法指令
(1) 格式:MULSRC
IMULSRC
功能:MUL為無符號數乘法指令,IMUL為帶符號數乘法指令。源運算元為通用暫存器或儲存器運算元。目的運算元預設存放在ACC(AL,AX,EAX)中,乘積存AX,DX:AX,EDX:EAX中。
位元組乘:ALSRC→AX
字乘:AXSRC→DX∶AX
雙字乘:EAXSRC→EDX∶EAX
MUL,IMUL指令執行後,CF=OF=0,表示乘積高位無有效資料;CF=OF=1表示乘積高位含有效資料,對其它標誌位無定義。
例 3.31
MUL BL;位元組乘
MUL WORD PTR [SI];字乘
IMUL BYTE PTR [DI];位元組乘
IMUL DWORD PTR [ECX];雙字乘
如果使用IMUL指令,積採用補碼形式表示。
(2) 格式:IMULDEST,SRC
功能:將目的運算元乘以源運算元,結果送目的運算元。目的運算元為16位或32位通用暫存器或儲存器運算元。源運算元為16位或32位通用暫存器、儲存器或立即數。
源運算元和目的運算元資料型別要求一致。乘積僅取和目的運算元相同的位數,高位部分將被捨去,並且CF=OF=1。其它標誌位無定義。
(3) 格式:IMUL DEST,SRC1,SRC2
功能:將源運算元SRC1與源運算元SRC2相乘,結果送目的運算元。目的運算元DEST為16位或32位,允許為通用暫存器。源運算元SRC1為16位或32位通用暫存器或儲存器運算元。源運算元SRC2允許為立即數。
例 3.32 IMULEAX,[EBX],12H
要求目的運算元和源運算元SRC1型別相同,當乘積超出目的運算元部分,將被捨去,並且使CF=OF=1,在使用這類指令時,需在IMUL指令後加一條判斷溢位的指令,溢位時轉錯誤處理執行程式。
八、除法指令
格式:DIV SRC
IDIV SRC
功能:DIV為無符號數除法,IDIV為帶符號數除法。源運算元作為除數,為通用暫存器或儲存器運算元。被除數預設在目的運算元AX,DX:AX,EDX:EAX中。
位元組除法:AX/SRC商→AL,餘數→AH
字除法:DX·AX/SRC商→AX,餘數→DX
雙字除法:EDX·EAX/SRC商→EAX,餘數→EDX
由於被除數必須是除數的雙倍字長,一般應使用擴充套件指令進行高位擴充套件。當進行無符號數除法時,被除數高位按0擴充套件為雙倍除數字長。當進行有符號數除法時,被除數以補碼錶示。可使用擴充套件指令CBW,CWD,CWDE,CDQ進行高位擴充套件。例如:
MOV AX,BLOCK
CWD;被除數高位擴充套件
MOV BX,1000H
IDIV BX
對於帶符號除法,其商和餘數均採用補碼形式表示,餘數與被除數同符號。當除數為零或商超過了規定資料型別所能表示的範圍時,將會出現溢位現象,產生一箇中斷型別碼為“0”的中斷。執行除法指令後標誌位無定義。
九、BCD算術運算
十進位制數在機器中採用BCD碼錶示,以壓縮格式存放,即一個位元組儲存2位BCD碼,BCD加減法是在二進位制加減運算的基礎上,對其二進位制結果進行調整,將結果調整成BCD碼錶示形式。
(1) 格式:DAA
功能:將存放在AL中的二進位制和數,調整為壓縮格式的BCD碼錶示形式。
調整方法:若AL中低4位大於9或標誌AF=1(表示低4位向高4位有進位),則
AL+6→AL,1→AF,
若AL中高4位大於9,或標誌CF=1,(表示高4位有進位),則
AL+60H→AL,1→CF,
DAA指令一般緊跟在ADD或ADC指令之後使用,影響標誌位為SF,ZF,AF,PF,CF。OF無定義。
例 3.33
ADD AL,BL
DAA
(2) 格式:DAS
功能:將存放在AL中的二進位制差數,調整為壓縮的BCD碼錶示形式。
調整方法:若AL中低4位大於9或標誌AF=1(表示低4位向高位借位),則
AL-6→AL,1→AF
若AL中高4位大於9或標誌CF=1(表示高4位向高位借位),則
AL-60H→AL,1→CF
DAS指令一般緊跟在SUB或SBB指令之後使用,影響標誌位為SF,ZF,AF,PF,CF。OF無定義。
例 3.34
SUB AL,BL
DAS
十、ASCII算術運算
數字0~9的ASCII碼為30H~39H,機器採用一個位元組存放一位ASCII碼,對於ASCII碼的算術運算是在二進位制運算基礎上進行調整。調整指令有加、減、乘、除四種調整指令。
(1) 格式:AAA
功能:將存放在AL中的二進位制和數,調整為ASCII碼錶示的結果。
調整方法:若AL中低4位小於或等於9,僅AL中高4位清0,AF→CF。若AL中低4位大於9或標誌AF=1(進位),則AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。
AAA指令一般緊跟在ADD或ADC指令之後使用,影響標誌位為AF,CF。其它標誌位無定義。
例 3.35
MOV AX,0036H
ADD,AL,35H
AAA;AX=0101H
(2) 格式:AAS
功能:將存放在AL中的二進位制差數,調整為ASCII碼錶示形式
調整方法:若AL中低4位小於等於9,僅AL中高4位清0,AF→CF。若AL中低4位大於9或標誌AF=1,則AL-6→AL,AH-1→AH,1→AF,AF→CF,AL中高4位清0。
AAS指令一般緊跟在SUB,SBB指令之後使用,影響標誌位為AF,CF。其它標誌位無定義。
例 3.36
MOV AX,0132H
SUB AL,35H
AAS;AX=0007H
(3) 格式:AAM
功能:將存放在AL中的二進位制積數,調整為ASCII碼錶示形式。
調整方法:AL/10商→AH,餘數→AL
AAM指令一般緊跟在MUL指令之後使用,影響標誌位為SF,ZF,PF。其它標誌位無定義。
例 3.37
MOV AL,07H
MOV BL,09H
MUL BL;AX=003FH
AAM;AX=0603H
(4) 格式:AAD
功能:將AX中兩位非壓縮BCD碼(一個位元組存放一位BCD碼),轉換為二進位制數的表示形式。
調整方法:AH10+AL→AL0→AH
AAD指令用於二進位制除法DIV操作之前,影響的標誌位為SF,ZF,PF。其它標誌位無定義。
例 3.38
MOV AX,0605H
MOV BL,09H
AAD;AX=0041H
DIV BL;AX=0207H
使用該類指令應注意,加法、減法和乘法調整指令都是緊跟在算術運算指令之後,將二進位制的運算結果調整為非壓縮BCD碼錶示形式,而除法調整指令必須放在除法指令之前進行,以避免除法出現錯誤的結果。
使用算術運算類指令應注意:
·如果沒有特別規定,參與運算的兩個運算元資料型別必須一致,且只允許一個為儲存器運算元;
·如果參與運算的運算元只有一個,且為儲存器運算元,必須使用PTR偽指令說明資料型別;
·運算元不允許為段暫存器。
·目的運算元不允許為立即數;
·如果是儲存器定址,則儲存器各種定址方式均可使用。
3.3.3邏輯運算指令
一、邏輯指令
1邏輯與指令
格式:AND DEST,SRC
功能:目的運算元和源運算元按位進行邏輯與運算,結果存目的運算元中。源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
例 3.39
AND AL,BL
AND EBX,ECX
AND [DI],1101H
AND指令常用於將運算元中某位清0(稱遮蔽),只須將要清0的位與0,其它不變的位與1即可。
例 3.40 AND AL,0FH;將AL中高4位清0,低4位保持不變。
AND指令影響標誌位為SF,ZF,PF,並且使OF=CF=0。
2邏輯或指令
格式:OR DEST,SRC
功能:目的運算元和源運算元按位進行邏輯或運算,結果存目的運算元中。源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
例 3.41
OR AX,BX
OR ECX,[EAX]
OR指令常用於將運算元中某位置1,只須將要置1的位或1,其它不改變的位或0即可。
例 3.42 OR AL,80H;將AL中最高位置1。
OR指令影響標誌位為SF,ZF,PF。並且使OF=CF=0。
3邏輯異或指令
格式:XOR DEST,SRC
功能:目的運算元和源運算元按位進行邏輯異或運算,結果送目的運算元。源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
例 3.43
XOR AX,BX
XOR [BX],1010H
XOR指令常用於將運算元中某些位取反,只須將要取反的位異或1,其它不改變的位異或0即可。
例 3.44 XOR AL,OFH;將AL中低4位取反,高4位保持不變。
XOR指令影響標誌位為SF,ZF,PF,並且使OF=CF=0。
4邏輯非指令
格式:NOT DEST
功能:對目的運算元按位取反,結果回送目的運算元。目的運算元可以為通用暫存器或儲存器。
例 3.45
NOT EAX
NOT BYTE PTR [BX]
NOT指令對標誌位無影響。
5測試指令
格式:TEST DEST,SRC
功能:目的運算元和源運算元按位進行邏輯與操作,結果不回送目的運算元。源運算元可以為通用暫存器、儲存器或立即數。目的運算元可以為通用暫存器或儲存器運算元。
例 3.46
TEST DWORD PTR [BX],80000000H
TEST AL,CL
TEST指令常用於測試運算元中某位是否為1,而且不會影響目的運算元。如果測試某位的狀態,對某位進行邏輯與1的運算,其它位邏輯與0,然後判斷標誌位。運算結果為0,ZF=1,表示被測試位為0;否則ZF=0,表示被測試位為1。
例 3.47 TEST AL,80H;測試AL中最高位
JNZ NEXT;如果最高位為1,轉到標誌NEXT處。
TEST指令影響標誌位為SF,ZF,PF,並且使OF=CF=0。
二、移位指令
移位指令對運算元按某種方式左移或右移,移位位數可以由立即數直接給出,或由CL間接給出。移位指令分一般移位指令和迴圈移位指令。
1一般移位指令
(1) 算術/邏輯左移指令。
格式:SAL DEST,OPRD
SHL DEST,OPRD
功能:按照運算元OPRD規定的移位位數,對目的運算元進行左移操作,最高位移入CF中。每移動一位,右邊補一位0。如圖312(a)所示。目的運算元可以為通用暫存器或儲存器運算元。
SAL,SHL指令影響標誌位OF,SF,ZF,PF,CF。
圖 3.12 移位指令示意圖
例 3.48
SHL BYTE PTR [DI],2
SAL BX,CL
(2) 算術右移指令。
格式:SAR DEST,OPRD
功能:按照運算元OPRD規定的移位次數,對目的運算元進行右移操作,最低位移至CF中,最高位(即符號位)保持不變。如圖312(b)所示。目的運算元可以為通用暫存器或儲存器運算元。
SAR指令影響標誌位OF,SF,ZF,PF,CF。
例 3.49
SAR AL,5
SAR WORD PTR /[ECX/],CL
(3) 邏輯右移指令。
格式:SHR DEST,SRC
功能:按照運算元OPRD規定的移位位數,對目的運算元進行右移操作,最低位移至CF中。每移動一位,左邊補一位0。如圖312(c)所示,目的運算元可以為通用暫存器或儲存器運算元。
SHR指令影響標誌位OF,SF,ZF,PF,CF。
例 3.50
SHR BYTE PTR [SI],3
SHR EDX,CL
算術/邏輯左移,只要結果未超出目的運算元所能表達的範圍,每左移一次相當於原數乘2。算術右移只要無溢位,每右移一次相當於原數除以2。
2迴圈移位指令
格式:ROL DEST,OPRD
ROR DEST,OPRD
RCL DEST,OPRD
RCR DEST,OPRD
功能:迴圈左移指令ROL,見圖313(a)所示,目的運算元左移,每移位一次,其最高位移入最低位,同時最高位也移入進位標誌CF。迴圈右移指令 ROR見圖313(b)所示,目的運算元右移,每移位一次,其最低位移入最高位,同時最低位也移入進位標誌CF。
帶進位迴圈左移指令RCL,見圖313(c)所示,目的運算元左移,每移動一次,其最高位移入進位標誌CF,CF移入最低位。帶進位迴圈右移指令RCR,見圖313(d)所示,目的運算元右移,每移動一次,其最低位移入進位標誌CF,CF移入最高位。
圖 3.13 迴圈移位指令
目的運算元可以為通用暫存器或儲存器運算元。迴圈移位指令影響標誌位CF,OF。其它標誌位無定義。
例 3.51
ROL AL,CL
ROR BX,5
RCL ECX,3
RCR BYTE PTR [SI],CL
例 3.52 將一個2位數壓縮的BCD碼轉換成二進位制數。
·MODEL SMALL
·DATA
BCD DB 01011001B
BIN DB?
CODE
·START UP
MOV AL,BCD
MOV BL,AL
AND BL,0FH
AND AL,0F0H
MOV CL,4
ROR AL,CL
MOV BH,0AH
MUL BH
ADD AL,BL
MOV BIN,AL
·EXIT
END
3雙精度移位指令
格式:SHLD DEST,SRC,OPRD
SHRD DEST,SRC,OPRD
功能:對於由目的運算元DEST和源運算元SRC構成的雙精度數,按照運算元OPRD給出的移位位數,進行移位。SHLD是對目的運算元進行左移,如 圖314(a)所示,SHRD是對目的運算元進行右移,如圖314(b)所示。先移出位送標誌位CF,另一端空出位由SRC移入DEST中,而SRC 內容保持不變。目的運算元可以是16位或32位通用暫存器或儲存器運算元。源運算元SRC允許為16位或32位通用暫存器。運算元OPRD可以為立即數或 CL。目的運算元和源運算元SRC資料型別必須一致。
圖 3.14 雙精度移位指令
SHLD,SHRD指令常用於位串的快速移位、嵌入和刪除等操作,影響標誌位為SF,ZF,PF,CF,其它標誌位無定義。
三、位操作指令
位操作指令包括位測試和位掃描指令,可以直接對一個二進位制位進行測試,設定和掃描。
1位測試和設定指令
格式:BT DEST,SRC
BTC DEST,SRC
BTR DEST,SRC
BTS DEST,SRC
功能:按照源操作指定的位號,測試目的運算元,當指令執行時,被測試位的狀態被複制到進位標誌CF。
BT將SRC指定的DEST中一位的數值複製到CF。BTC將SRC指定的DEST中一位的數值複製到CF,且將DEST中該位取反。BTR將SRC 指定的DEST中一位的數值複製到CF,且將DEST中該位復位。BTS將SRC指定的DEST中一位的數值複製到CF,且將DEST中該位置位。
目的運算元為16位或32位通用暫存器或儲存器,源運算元為16位或32位通用暫存器,以及8位立即數,當源運算元為通用暫存器時,必須同目的運算元型別一致。源運算元SRC以兩種方式給出目的運算元的位號,即
· SRC為8位立即數,以二進位制形式直接給出要操作的位號;
· SRC為通用暫存器,如果DEST為通用暫存器,則SRC中二進位制值直接給出要操作的位號。如果DEST為儲存器運算元,通用暫存器SRC為帶符號整數, SRC的值除以DEST的長度所得到的商作為DEST的相對偏移量,餘數直接作為要操作的位號。DEST的有效地址為DEST給出的偏移地址和DEST相 對偏移量之和。
BT,BTC,BTR,BTS指令影響CF標誌位,其它標誌位無定義。
例 3.53
MOV AX,1234H
MOV ECX,5
BT AX,CX ;CF=1AX=1234H
BTC AX,5 ;CF=1;AX=1214H
BTS AX,CX; ;CF=0AX=1234H
BTR EAX,ECX ;CF=1EAX=00001214H
例 3.54
·MODEL SMALL
·586
·DATA
DATA1 DW 1234H,5678H
·CODE
·START UP
BTC DATA1,3;CF=0(DATA1)=123CH
MOV CX,20
BTR DATA1,CX;CF=1[DATA+2]=5668H
·EXIT
END
2位掃描指令
格式:BSFDEST,SRC
BSRDEST,SRC
功能:BSF從低位開始掃描源運算元,若所有位都是0,則ZF=0,否則ZF=1。並且將第一個出現1的位號存入目的運算元。BSR從高位開始掃描源運算元,若所有位都是0,則ZF=0,否則ZF=1。並且將第一個出現1的位號存入目的運算元。
源運算元可以為16位32位通用暫存器或儲存器。目的運算元為16位或32位通用暫存器。源運算元和目的運算元型別必須一致。
BSF,BSR指令影響ZF標誌位,其它標誌位無定義。
例 3.55
MOV EBX,0F333EE00H
BSR EAX,EBX;ZF=1EAX=0000001FH=31
BSF EDX,EBX;ZF=1EDX=00000009H
3進位標誌指令
(1) 格式:CLC。功能:清除進位標誌。
(2) 格式:STC。功能:設定進位標誌。
(3) 格式:CMC。功能:進位標誌取反。
4條件設定位元組指令
條件設定指令用於根據條件設定某一狀態位元組或標誌位元組,見表33。
格式:SETcondDEST
功能:測試條件(cond)若為真,則將目的運算元置01H,否則置00H。目的運算元允許為8位通用暫存器或8位儲存器運算元。
條件cond與條件轉移指令中的條件相同,共分三類。
(1) 以標誌位狀態為條件可以測試的標誌位為ZF,SF,OF,CF,PF。
(2) 以兩個無符號數比較為條件條件為高於、高於等於、低於、低於等於。
(3) 以兩個帶符號數比較為條件條件為大於、大於等於、小於、小於等於。
SET指令不影響標誌位。
使用邏輯運算類指令應注意:
· 如果沒有特別規定,參與運算的兩個運算元型別必須一致,且只允許一個為儲存器運算元;
· 如果參與運算的運算元只有一個,且為儲存器運算元,必須使用PTR偽指令說明其資料型別;
· 運算元不允許為段暫存器;
· 目的運算元不允許為立即數;
· 如果是儲存器定址,則前面介紹的各種儲存器定址方式均可使用。
表 3.3 條件設定位元組指令
3.3.4控制轉移類指令
計算機執行程式一般是順序地逐條執行指令。但經常須要根據不同條件做不同的處理,有時需要跳過幾條指令,有時需要重複執行某段程式,或者轉移到另一個程式段去執行。用於控制程式流程的指令包括轉移、迴圈、過程呼叫和中斷呼叫。
一、轉移指令
1無條件轉移指令
格式:JMP TARGET
功能:使程式無條件地轉移到指令規定的目的地址TARGET去執行指令。轉移分為短轉移、段內轉移(近程轉移)和段間轉移(遠端轉移)。
(1) 段內直接轉移:
格式:JMP SHORT TARGET;短轉移
JMP NEAR PTR TARGET;近程轉移
功能:採用相對定址將當前IP值(即JMP指令下一條指令的地址)與JMP指令中給出的偏移量之和送IP中。段內短轉移(SHORT)指令偏移量為8 位,允許轉移偏移值的範圍為-128~+127。段內近程轉移(NEAR)指令在16位指令模式下,偏移量為16位,允許轉移偏移值範圍為-215~+ 215-1。在32位指令模式下,偏移值範圍為-231~+231-1。
例 3.56
JMP NEXT
NEXT:MOV AL,BL
本例為無條件轉移到本段內,標號為NEXT的地址去執行指令,彙編程式可以確定目的地址與JMP指令的距離。
(2) 段內間接轉移:
格式:JMP REG
JMP NEAR PTR [REG]
功能:段內間接轉移,其中JMP REG指令地址在通用暫存器中,將其內容直接送IP實現程式轉移。JMP NEAR PTR [REG]指令地址在儲存器中,預設段暫存器根據參與定址的通用暫存器來確定,將指定儲存單元的字取出直接送IP實現程式轉移。在16位指令模式,轉移偏 移值範圍為。在32位指令模式,轉移偏移值範圍為。
例 3.57 設DS=1000HEBX=00002000H。
JMP BX ;將2000H送IP
JMP NEAR PTR [BX] ;將地址1000∶2000單元存放的一個字送IP
JMP NEAR PTR [EBX] ;將段選擇符為1000H,偏移地址為00002000H單元存放的雙字送EIP。
(3) 段間直接轉移:
格式:JMP FAR PTR TARGET
功能:段間直接轉移,FAR PTR說明標號TARGET具有遠端屬性。將指令中由TARGET指定的段值送CS,偏移地址送IP。
例 3.58 JMP FAR PTR NEXT。
在16位指令模式下,段基地送CS,偏移地址為16位,轉移偏移值範圍;在32位指令模式下,程式碼段選擇符送CS,偏移地址為32位,轉移偏移值範圍為。
(4) 段間間接轉移:
格式:JMP FAR PTR [Reg]
功能:段間間接轉移,由FAR PTR [Reg]指定的儲存器運算元作為轉移地址。
在16位指令模式下,儲存器運算元為32位,包括16位段基址和16位偏移地址。
例 3.59
JMP FAR PTR [BX] ;資料段雙字儲存單元低字內容送IP
;資料段雙字儲存單元高字內容送CS
在32位指令模式下,儲存器運算元包括16位選擇符。
例 3.60 JMP FAR PTR [EAX]
指令中包含指向目標地址指標的門描述符或TSS描述符的指標,其所指的儲存器運算元中僅選擇符部分有效,指示呼叫門、任務門或TSS描述符起作用,而偏移部分不起作用。
2條件轉移指令
該類指令是根據上一條指令對標誌暫存器中標誌位的影響來決定程式執行的流程,若滿足指令規定的條件,則程式轉移;否則程式順序執行。
條件轉移指令的轉移範圍為段內短轉移或段內近程轉移,不允許段間轉移。段內短轉移(short)的轉移偏移值範圍為-128~+127。段內近程轉移,在16位指令模式下轉移偏移值範圍為,在32位指令模式下轉移偏移值範圍為。
條件轉移指令包括四類:單標誌位條件轉移;無符號數比較條件轉移;帶符號數比較條件轉移;測試CX條件轉移。
格式:Jcc TARGET
功能:若測試條件‘CC’為真,則轉移到目標地址TARGET處執行程式。否則順序執行。
(1) 單標誌位條件轉移指令,見表34。
例 3.61 JZ NEXT;若標誌ZF=1則轉移到標號NEXT處執行。
(2) 無符號數比較條件轉移,見表35。
例 3.62 JA NEXT;無符號數A與B比較,若A>B則轉移到標號NEXT處執行程式
表 3.4 單標誌位條件轉移指令
表 3.5 無符號數比較條件轉移指令
表 3.6 帶符號數比較條件轉移指令
例 3.63 JG NEXT;帶符號數A與B比較,若A>B則轉移到標號NEXT。
(4) 測試CX條件轉移,見表37。
表 3.7 測試CX條件轉移指令
例 3.64 JCXZ TARGET;CX=0轉移到標號TARGET處。
JECXZ TARGET;ECX=0轉移到標號TARGET處。
條件轉移指令一般緊跟在CMP或TEST指令之後,判斷執行CMP或TEST指令對標誌位的影響來決定是否轉移。
例 3.65 符號函式
假設x為某值且存放在暫存器AL中,試程式設計將求出的函式值f(x)存放在AH中。
·MODEL TINY
·CODE
·STARTUP
CMPAL,0
JGE BIG
MOV AL,0FFH
JMP DONE
BIG: JE DONE
MOV AL,1
DONE:MOV AH,AL
·EXIT
END
例 3.66 程式設計實現把BX暫存器內的二進位制數用十六進位制數的形式在螢幕上顯示出來。
·MODEL TINY
·CODE
·STARTUP
MOV CH,4
AGAIN: MOV CL,4
ROL BX,CL
MOV AL,BL
ANDAL,0FH
OR AL,30H
CMP AL,3AH
JB NEXT
ADD AL,07H
NEXT: MOV DL,AL;DL←要顯示的ASCII碼
MOV AH,2;顯示
INT 21H
DECCH
JNZ AGAIN
·EXIT
END
二、迴圈控制指令
這類指令用(E)CX計數器中的內容控制迴圈次數,先將迴圈計數值存放在(E)CX中,每迴圈一次(E)CX內容減1,直到(E)CX為0時迴圈結束。
格式:LOOPcc TARGET
功能:將(E)CX內容減1,不影響標誌位,若(E)CX不等於0,且測試條件‘CC’成立,則轉移到目標地址TARGET處執行程式。轉移範圍為-128~+127。如表38所示。
表3.8 迴圈控制指令
例 3.67 計算
·MODEL TINY
·CODE
·STARTUP
XOR EAX,EAX
MOV EDX,1
MOV ECX,1000
SUM: ADD EAX,EDX
INC EDX
LOOPD SUM
·EXIT
END
例 3.68 找出以ARRAY為首地址的100個字陣列中的第一個非0項,送AX暫存器中。
·MODELSMALL
·DATA
ARRAYDW 0,0,0,0,1010H,…;(100個字)
·CODE
·STARTUP
MOV CX,64H
LEA BX,ARRAY
MOV SI,0FFFEH
ZERO: INC SI
INC SI
CMP WORD PTR [BX+SI],0
LOOPZ ZERO
MOV AX,[BX+SI]
·EXIT
END
關於過程呼叫和返回指令將在子程式一節中介紹。
3.3.5串操作指令
80x86提供處理字串的操作。串指連續存放在儲存器中的一些資料位元組、字或雙字。串操作允許程式對連續存放大的資料塊進行操作。
串操作通常以DS:(E)SI來定址源串,以ES:(E)DI來定址目的串,對於源串允許段超越。(E)SI或(E)DI這兩個地址指標在每次串操作 後,都自動進行修改,以指向串中下一個串元素。地址指標修改是增量還是減量由方向標誌來規定。當DF=0,(E)SI及(E)DI的修改為增量;當DF= 1,(E)SI及(E)DI的修改為減量。根據串元素型別不同,地址指標增減量也不同,在串操作時,位元組型別SI,DI加、減1;字型別SI,DI加、減 2;雙字型別ESI,EDI加、減4。如果需要連續進行串操作,通常加重複字首。重複字首可以和任何串操作指令組合,形成複合指令,見表39。
一、重複字首指令
表 3.9 重複字首指令
二、方向標誌指令
格式:CLD/STD
功能:CLD為清除方向標誌,即將DF置‘0’。STD為設定方向標誌,即將DF置‘1’。
三、串傳送指令
基本格式:[REP]MOVS DESTS, SRCS
[REP] MOVSB/MOVSW/MOVSD
功能:將DS:(E)SI規定的源串元素複製到ES:(E)DI規定的目的串單元中,見表310。
表 3.10 MOVS指令
該指令對標誌位無影響。
如果加重複字首REP,則可以實現連續存放的資料塊的傳送,直到(E)CX=0為止。
在16位指令模式下,使用SI,DI,CX暫存器;在32位指令模式下,使用ESI,EDI,ECX暫存器。
例 3.69
·MODEL SMALL
·DATA
SRC DB 1,2,3,…(100個位元組)
DEST DB 100DUP(?)
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,100
LEA SI,SRC
LEA DI,DEST
CLD
REP MOVSB
·EXIT
END
該程式將起始地址為SRC的100個位元組內容傳送到起始地址為DEST的儲存單元。
四、串比較指令
基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
[REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
功能:由DS:(E)SI規定的源串元素減去ES:(E)DI指出的目的串元素,結果不回送,僅影響標誌位CF,AF,PF,OF,ZF,SF。當源 串元素與目的串元素值相同時,ZF=1;否則ZF=0。每執行一次串比較指令,根據DF的值和串元素資料型別自動修改(E)SI和(E)DI。
在串比較指令前加重複字首REPE/Z,則表示重複比較兩個字串,若兩個字串的元素相同則比較到(E)CX=0為止,否則結束比較。在串比較指令 前加重複字首REPNE/NZ,則表示若兩個字串元素不相同時,重複比較直到(E)CX=0為止,否則結束比較。
例 3.70 程式設計實現兩個串元素比較,如相同則將全“1”送SUT單元,否則全“0”送SUT單元。
·MODEL SMALL
·DATA
DEST DB ‘A B C D E F G H’
SRC DB ‘A B C E F F F E’
SUT DB?
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,8
LEA SI,DEST
LEA DI,SRC
CLD
REPE CMPSB
JZ EQUL;ZF=1;CX=0
MOV BH,0;CX≠0,ZF=0
JMP DONE
EQUL: MOV BH,0FFH
DONE: MOV SUT,BH
·EXIT
END
五、串掃描指令
格式①: [REPE/Z] [REPNE/NZ] SCAS DESTS
格式②: [REPE/Z] [REPNE/NZ] SCASB/SCASW/SCASD
功能:由AL,AX或EAX的內容減去ES:(E)DI規定的目的串元素,結果不回送,僅影響標誌位CF,AF,PF,SF,OF,ZF。當AL, AX或EAX的值與目的串元素值相同時,ZF=1;否則ZF=0。每執行一次串掃描指令,根據DF的值和串元素資料型別自動修改(E)DI。
在串掃描指令前加重複字首REPE/Z,則表示目的串元素值和累加器值相同時重複掃描,直到CX/ECX=0為止,否則結束掃描。若加重複字首 REPNE/NZ,則表示當目的串元素值與累加器值不相等時,重複掃描直到CX/ECX=0時為止,否則結束掃描。
該指令影響標誌位為CF,AF,PF,SF,OF,ZF。
例 3.71 在記憶體DEST開始的6個單元尋找字元‘C’,如找到將字元‘C’的地址送ADDR單元,否則0送ADDR單元。
·MODEL SMALL
·DATA
DEST DB ‘A B C D E F’
ADDR DW?;存“C”的地址,所以設定為字型別
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,6
LEA DI,DEST
MOV AL,‘C’
CLD
REPNE SCASB
JZ EQUL
MOV DI,0
JMP DONE
EQUL: DEC DI
DONE: MOV ADDR,DI
·EXIT
END
六、 串裝入指令
格式:LODS SRCS
LODSB/LODSW/LODSD
功能:將DS:SI/ESI所指的源串元素裝入累加器(AL,AX,EAX)中,每裝入一次都按照DF值以及串元素型別自動修改地址指標SI/ESI,該指令一般不須加重複字首,並且不影響標誌位。
七、 串儲存指令
格式:[REP] STOS DESTS
[REP] STOSB/STOSW/STOSD
功能:將累加器/[AL,AX,EAX/]中值存入ES:DI/EDI所指的目的串儲存單元中,每傳遞一次,都按DF值以及串元素型別自動修改地址指 針DI/EDI。若加重複字首REP,則表示將累加器的值連續送目的串儲存單元,直到CX/ECX=0時為止。
該指令不影響標誌位。
3.3.6輸入/輸出指令
一、 輸入指令
格式:IN DEST, SRC
功能:根據源運算元SRC給出的埠地址,將運算元從指定埠傳送到目的運算元DEST處,其中DEST為AL,AX或EAX,埠地址SRC可以直接形式給出8位埠地址,或由DX暫存器以間接形式給出。
例 3.72
IN AL,10H
IN AX,20H
IN EAX,30H
IN AL,DX
IN AX,DX
IN EAX,DX
二、 輸出指令
格式OUT DEST, SRC
功能:將源運算元SRC送到目的運算元DEST所指定的埠。其中源運算元SRC為AL,AX或EAX,目的運算元可以8位埠地址方式直接給出或以DX暫存器間接方式給出。
使用輸入、輸出指令應注意:
· 直接定址方式埠地址為8位,共有0~255個埠地址;
· 間接定址方式,只能用DX作為地址暫存器,定址範圍為64K位元組;
· 每個I/O地址對應的埠的資料長度為8位,傳送8位資料佔用一個埠地址,傳送16位資料佔用2個埠地址,傳送32位資料佔用4個埠地址。
三、 串輸入指令
格式:[REP] INS DESTS, DX
[REP] INSB/INSW/INSD
功能:根據DX給出的埠地址,從外設讀入資料送入以ES:DI/EDI為地址的目的串儲存單元中,每輸入一次,均根據DF的值和串元素型別自動修改 DI/EDI的值。若加重複字首REP,則表示連續從外設輸入串元素存入目的串儲存單元中,直到CX/ECX=0為止。
例 3.73 從埠地址為1000H處取數存入記憶體BLOCK單元。
·MODEL SMALL
·DATA
BLOCKDB?
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
CLD
LEA DI,BLOCK
MOV DX,1000H
INS BLOCK,DX
·EXIT
END
四、串輸出指令
格式:[REP] OUTS DX,SRCS
[REP] OUTSB/OUTSW/OUTSD
功能:將DS:SI/ESI所指的源串元素,按照DX暫存器指定的埠地址送往外設,每輸出一次,均根據DF的值和串元素型別自動修改SI/ESI的值,若加重複字首REP,則表示連續向外設輸出串元素,直到CX/ECX=0時為止。
例 3.74 將記憶體BLOCK為首地址的100個字元送往埠地址為2000H的外設。
·MODEL SMALL
·DATA
BLOCKDB ‘A,B,…’(100個字元)
·CODE
·STARTUP
CLD
LEA SI,BLOCK