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擴展為雙倍除數字長。當進行有符號數除法時,被除數以補碼表示??墒褂脭U展指令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給出的port地址,將操作數從指定port傳送到目的操作數DEST處,當中DEST為AL,AX或EAX,port地址SRC能夠直接形式給出8位port地址,或由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所指定的port。當中源操作數SRC為AL,AX或EAX,目的操作數能夠8位port地址方式直接給出或以DX寄存器間接方式給出。
使用輸入、輸出指令應注意:
· 直接尋址方式port地址為8位,共同擁有0~255個port地址;
· 間接尋址方式,僅僅能用DX作為地址寄存器,尋址范圍為64K字節;
· 每一個I/O地址相應的port的數據長度為8位,傳送8位數據占用一個port地址,傳送16位數據占用2個port地址,傳送32位數據占用4個port地址。
三、 串輸入指令
格式:[REP] INS DESTS, DX
[REP] INSB/INSW/INSD
功能:依據DX給出的port地址,從外設讀入數據送入以ES:DI/EDI為地址的目的串存儲單元中,每輸入一次,均依據DF的值和串元素類型自己主動改動 DI/EDI的值。若加反復前綴REP,則表示連續從外設輸入串元素存入目的串存儲單元中,直到CX/ECX=0為止。
例 3.73 從port地址為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寄存器指定的port地址送往外設,每輸出一次,均依據DF的值和串元素類型自己主動改動SI/ESI的值,若加反復前綴REP,則表示連續向外設輸出串元素,直到CX/ECX=0時為止。
例 3.74 將內存BLOCK為首地址的100個字符送往port地址為2000H的外設。
·MODEL SMALL
·DATA
BLOCKDB ‘A,B,…’(100個字符)
·CODE
·STARTUP
CLD
LEA SI,BLOCK
MOV CX,100
MOV DX,2000H
REP OUTSB
·EXIT
END
在使用帶反復前綴的串輸入輸出指令時,必須考慮port的數據準備或接收狀態。
全部輸入輸出指令均不影響標志位。
3.3.7處理器控制
一、 總線封鎖前綴
格式:LOCK指令
功能:LOCK為指令前綴,能夠使LOCK引腳變成邏輯0,在LOCK引腳有效期間,禁止外部總線上的其他處理器存取帶有LOCK前綴指令的存儲器操作數。
可加LOCK前綴的指令:
(1) ADD/SUB/ADC/SBB/OR/XOR/AND Mem, Reg/imm;
(2) NOT/NEG/INC/NEC Mem;
(3) XCHG Reg, Mem或XCHG Mem, Reg;
(4) BT/BTS/BRT/BTC Mem, Reg/imm。
Mem為存儲器操作數,Reg為通用寄存器,imm為馬上數。
二、空操作
格式:NOP
功能:空操作,除使IP/EIP增1外,不做不論什么工作。該指令不影響標志位。
三、處理器等待指令
格式:WAIT
功能:檢查BUSY引腳狀態,等待協處理器完畢當前工作。
四、處理器暫停指令
格式:HLT
功能:暫停程序的運行。當產生一個外部中斷或非屏蔽中斷時,才繼續運行下一條指令。
3.3.8中斷指令與DOS功能調用
一、中斷指令
在實模式下,中斷矢量以4個字節存放在中斷矢量表中,中斷矢量表為1k字節(00000H~003FFH),中斷矢量表同意存放256個中斷矢量,每 個中斷矢量包括一個中斷服務程序地址(段值和16位偏移地址),中斷矢量地址指針由中斷類型碼乘以4得到。
在保護模式下,用中斷描寫敘述符表取代中斷矢量表,每一個中斷由8個字節的中斷描寫敘述符來說明,中斷描寫敘述符表同意256個中斷描寫敘述符,每一個中斷描寫敘述符包括一個中斷服務地址(段選擇符、32位偏移地址、訪問權限等)。中斷描寫敘述符地址指針由中斷類型碼乘以8得到。
中斷指令格式:INT n
功能:產生中斷類型碼為n的軟中斷,該指令包括中斷操作碼和中斷類型碼兩部分,中斷類型碼n為8位,取值范圍為0~255(00H~FFH)。
軟中斷運行過程:
· 將標志寄存器FLAGS(或EFLAGS)壓入堆棧;
· 清除TF和IF標志位;
· CS,IP/EIP壓入堆棧;
· 實模式下,n×4獲取中斷矢量表地址指針;保護模式下,n×8獲取中斷描寫敘述符表地址指針;
· 依據地址指針,從中斷矢量表或中斷描寫敘述符表中取出中斷服務程序地址送IP/EIP和CS中,控制程序轉移去運行中斷服務程序。
中斷返回指令格式:IRET/IRETD
功能:該指令實如今中斷服務程序結束后,返回到主程序中斷斷點處,繼續運行主程序。
中斷返回運行過程:
· IRET指令彈出堆棧中數據送IP,CS,FLAGS;
· IRETD指令彈出堆棧中數據送EIP,CS,EFLAGS。
其他中斷類指令如表311所看到的。
表 3.11 中斷類指令
二、DOS功能調用
系統功能調用是MS—DOS為程序猿編寫匯編語言源程序提供的一組子程序,包含設備管理、文件管理和文件夾管理等。
DOS規定使用軟中斷指令INT 21H作為進入各功能子程序的總入口,再為每一個功能調用規定一個功能號,引用功能號就可以進入對應的子程序入口。DOS系統功能調用的用法歸納例如以下:
(1) 傳送入口參數到指定的寄存器中;
(2) 把要調用功能的功能號送入AH寄存器中;
(3) 用INT 21H指令轉入子程序入口;
(4) 對應的子程序運行結束后,能夠依照規定取得出口參數。
經常使用系統功能調用簡單介紹。
1鍵盤輸入單字符
這是1號系統功能調用,其調用格式為
MOV AH,1
INT 21H
該功能調用無入口參數。其功能為系統等待鍵盤輸入,如是Ctrol-Break鍵則退出;否則將鍵入字符的ASCII碼送入AL寄存器中,而且通過顯示器顯示該字符。
2鍵盤輸入字符串
這是0AH號系統功能調用,其功能為將鍵盤輸入的字符串寫入內存單元中。因此,首先在內存中定義一個緩沖區,緩沖區第一個字節存放規定字符串的最大字 節數,第二個字節由系統送入實際鍵入的字符數,從第三個字節開始用于存放鍵入的字符串,最后通過鍵入回車鍵來表示字符串的結束。假設實際鍵入的字符數未達 到最大規定數,其緩沖區的空余區間填0;假設實際鍵入數超過緩沖區的容量,則超出的字符自己主動丟失,而且響鈴警告。注意,回車鍵值也存于緩沖區中。
例 3.75 使用格式舉例。
·MODEL SMALL
·DATA
BUF DB 20
DB?
DB 20 DUP(?)
·CODE
·STARTUP
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
·EXIT
END
該程序在BUF為首地址的緩沖區定義了20個字符串字節的緩沖區,而且將緩沖區首地址送入DX中,調用0AH號子程序,系統等待用戶鍵入字符串,每鍵 入一個字符,其對應的ASCII碼將被寫入緩沖區中,直到鍵入回車鍵,由系統輸入實際鍵入字符數,送入緩沖區第二個字節中。
3輸出單字符
這是2號系統功能調用,其使用格式為:
MOV DL,‘A’
MOV AH,2
INT 21H
運行2號系統功能調用,將置入DL寄存器中的字符(以ASCII碼形式表示)通過顯示器顯示出來(或從打印機輸出)。
4輸出字符串
這是9號系統功能調用,其功能是將指定的內存緩沖區中的字符串從顯示器顯示輸出(或從打印機輸出),緩沖區中的字符串以字符‘$’作為結束標志。
例 3.76使用格式舉例。
·MODEL SMALL
·DATA
BUF DB ‘Thank you $’
·CODE
·STARTUP
MOV DX,OFFSET BUF
MOV AH,9
INT 21H
·EXIT
END
5返回操作系統
這是4CH號系統功能調用,使用格式為
MOV AH,4CH
INT 21H
在用戶程序結束處插入此調用,則返回到DOS操作系統,顯示器顯示系統提示符。
習題與思考題
1數據尋址方式有哪幾種?
216位指令模式下和32位指令模式下的存儲器尋址方式各有哪幾種尋址方式?并比較它們類似與不同之處。
3程序地址尋址方式有哪幾種?
4什么是堆棧地址尋址方式?
5指令編碼格式是由哪幾部分組成的?各部分的含義是什么?
6 80x86的指令格式由哪幾部分組成?
7 80x86指令系統按其功能可分為幾部分?
8數據傳送指令包含哪些類型?
9堆棧的含義是什么?80x86所用的堆棧有什么特點?
10堆棧操作指令有哪幾種?
11 XLAT指令在使用時有哪些規定?
12符號擴展指令在什么情況下使用?
13十進制算術運算調整指令在什么情況下使用?它們都是跟在哪些指令的后面?
14哪些指令採用隱含尋址?
15使用算術運算類指令應注意哪些問題?
16邏輯運算指令有幾種?
17測試指令和比較指令在使用時有什么不同?
18算術移位指令和邏輯移位指令有什么不同?
19控制轉移類指令的作用是什么?有哪幾種?
20什么叫串?串操作指令有哪些?串前綴在什么情況下使用?
21輸入/輸出指令起什么作用?尋址方式有哪些?
22設DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX=00001000H,EBX= 00002000H,假設按16位實模式操作,確定下列每條指令訪問內存的物理地址,而且指出源操作數及目的操作數的尋址方式。
(1) MOV AL,[1234H](2) MOV EDX,[BX]
(3) MOV CL,[BX+100H](4) MOV [SI],EBX
(5) MOV AH,BUF[BX+SI](6) MOV EAX,[BP+1234H]
(7) MOV [EAX+EBX],DH
23試指出下列指令中的錯誤。
(1) MOV [BX],[SI](2) MOV AH,DX
(3) INC [BX](4) MOV DS,SS
(5) XCHG AX,2000H(6) MOV AX,[BX+DX]
(7) XCHG [SP],ES(8) ADD [AX],BX
(9) MOV AX,DI+SI(10) INAL,BX
24指出下列算術邏輯指令運行后標志CF,ZF,SF,PF,OF和AF的狀態。
MOV AL,80H
DEC AL
ADD AL,10H
SUB AL,10H
MOV AL,3AH
AND AL,0F0H
OR AL,0F0H
XOR AL,0F0H
25使AX寄存器清0有多種方式,試寫出這多條指令。
26寫出把首地址為BUF的字節緩沖區中第5個字節數送AL寄存器的指令,要求使用下面幾種尋址方式:
(1) 寄存器間接尋址;
(2) 寄存器相對尋址;
(3) 基址變址尋址。
27試分別使用數據傳送指令、交換指令和堆棧操作指令,實現將首地址為BLOCK的內存單元中兩個數據字交換。BLOCK變量定義例如以下:
BLOCK DW 10H,20H
28設一個字節數據X存放在AL寄存器中,試說明下列程序的功能。
XOR AH,AH
SAL AX,1
MOV BX,AX
MOV CL,2
SAL AX,CL
ADD AX,BX
29試編程實現:
(1) AL寄存器的低4位清0;
(2) BL寄存器的低4位置1;
(3) CL寄存器的低4位取反;
(4) 測試DL寄存器的最低2位是否為0,若是將0送入AL寄存器;否則將1送AL寄存器。
30試編程統計在AX寄存器中有多少個1,并將結果送DL寄存器中。
31試編程統計在內存BLOCK單元開始按字節存放的100個帶符號數中有多少負數,并將結果存放在DL寄存器中。
總結
以上是生活随笔為你收集整理的x86汇编指令具体解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS8中提示框的使用UIAlertCo
- 下一篇: 华为防火墙的技术积累