x86汇编指令具体解释
80x86指令系統(tǒng)
80x86指令系統(tǒng),指令按功能可分為下面七個(gè)部分。
(1) 數(shù)據(jù)傳送指令。
(2) 算術(shù)運(yùn)算指令。
(3) 邏輯運(yùn)算指令。
(4) 串操作指令。
(5) 控制轉(zhuǎn)移指令。
(6) 處理器控制指令。
(7) 保護(hù)方式指令。
3.3.1數(shù)據(jù)傳送指令
數(shù)據(jù)傳送指令包含:通用數(shù)據(jù)傳送指令、地址傳送指令、標(biāo)志寄存器傳送指令、符號(hào)擴(kuò)展指令、擴(kuò)展傳送指令等。
一、通用數(shù)據(jù)傳送指令
1傳送指令
傳送指令是使用最頻繁的指令,格式:MOV DEST,SRC
功能:把一個(gè)字節(jié),字或雙字從源操作數(shù)SRC傳送至目的操作數(shù)DEST。
傳送指令同意的數(shù)據(jù)流方向見圖311。
圖 3.11 傳送指令數(shù)據(jù)流
由上圖可知,數(shù)據(jù)同意流動(dòng)方向?yàn)?#xff1a;通用寄存器之間、通用寄存器和存儲(chǔ)器之間、通用寄存器和段寄存器之間、段寄存器和存儲(chǔ)器之間,另外還同意馬上數(shù)傳送至通用寄存器或存儲(chǔ)器。但在上述傳送過程中,段寄存器CS的值不能用傳送指令改變。
例 3.12CPU內(nèi)部寄存器之間的數(shù)據(jù)傳送。
MOV AL,DH ;AL←DH (8位)
MOV DS,AX ;DS←AX (16位)
MOV EAX,ESI ;EAX←ESI (32位)
例 3.13CPU內(nèi)部寄存器和存儲(chǔ)器之間的數(shù)據(jù)傳送。
MOV [BX],AX ;間接尋址 (16位)
MOV EAX,[EBX+ESI] ;基址變址尋址 (32位)
MOV AL,BLOCK ;BLOCK為變量名,直接尋址(8位)
例 3.14馬上數(shù)送通用寄存器、存儲(chǔ)器。
MOV EAX,12345678H ;EAX←12345678H (32位)
MOV [BX],12H ;間接尋址 (8位)
MOV AX,1234H;AX←1234H(16位)
使用該指令應(yīng)注意下面問題:
·源和目的操作數(shù)不同意同一時(shí)候?yàn)榇鎯?chǔ)器操作數(shù);
·源和目的操作數(shù)數(shù)據(jù)類型必須一致;
·源和目的操作數(shù)不同意同一時(shí)候?yàn)槎渭拇嫫?#xff1b;
·目的操作數(shù)不同意為CS和馬上數(shù);
·當(dāng)源操作數(shù)為馬上數(shù)時(shí),目的操作數(shù)不同意為段寄存器;
·傳送操作不影響標(biāo)志位。
2擴(kuò)展傳送指令
格式:MOV SX DEST,SRC
MOV ZX DEST,SRC
功能:將源操作數(shù)由8位擴(kuò)展到16位送目的操作數(shù),或由16位擴(kuò)展到32位送目的操作數(shù)。當(dāng)中MOVSX是按有符號(hào)數(shù)擴(kuò)展,MOVZX是按無符號(hào)數(shù)擴(kuò)展。無符號(hào)數(shù)或正數(shù)高位擴(kuò)展為0,負(fù)數(shù)高位擴(kuò)展為全“1”。
例 3.15帶符號(hào)數(shù)擴(kuò)展
MOV BL,80H ; -128
MOVSX AX,BL ; 將80H擴(kuò)展為FF80H后送AX中。
例 3.16無符號(hào)數(shù)擴(kuò)展
MOV BL,80H ; 128
MOVZX AX,BL ; 將80H擴(kuò)展為0080H后送AX中。
使用該指令應(yīng)注意下面問題:
·目的操作數(shù)應(yīng)為16位或32位通用寄存器;
·源操作數(shù)長(zhǎng)度須小于目的操作數(shù)長(zhǎng)度,為8位或16位通用寄存器或存儲(chǔ)器操作數(shù);
·擴(kuò)展傳送操作不影響標(biāo)志位。
3交換指令
(1) 格式:XCHG OPR1,OPR2
功能:交換操作數(shù)OPR1和OPR2的值,操作數(shù)數(shù)據(jù)類型為字節(jié)、字或雙字。同意通用寄存器之間,通用寄存器和存儲(chǔ)器之間交換數(shù)據(jù)。
例 3.17
XCHG AX,BX;通用寄存器之間交換數(shù)據(jù)(16位)
XCHG ESI,EDI;通用寄存器之間交換數(shù)據(jù)(32位)
XCHG BX,/[SI/];通用寄存器和存儲(chǔ)器之間交換數(shù)據(jù)(16位)
XCHG AL,/[BX/];通用寄存器和存儲(chǔ)器之間交換數(shù)據(jù)(8位)
使用該指令應(yīng)注意下面問題:
·操作數(shù)OPR1和OPR2不同意同為存儲(chǔ)器操作數(shù);
·操作數(shù)數(shù)據(jù)類型必須一致;
·交換指令不影響標(biāo)志位。
如要實(shí)現(xiàn)存儲(chǔ)器操作數(shù)交換,可用例如以下指令實(shí)現(xiàn):
MOV AL,BLOCK1
XCHG AL,BLOCK2
MOV BLOCK1,AL
(2) 格式:BSWAP REG
功能:將32位通用寄存器中,第1個(gè)字節(jié)和第4個(gè)字節(jié)交換,第2個(gè)字節(jié)和第3個(gè)字節(jié)交換。
例 3.18
MOV EAX,44332211H
BSWAP EAX;EAX=11223344H
使用該指令應(yīng)注意下面問題:
·操作數(shù)為32位通用寄存器;
·交換指令不影響標(biāo)志位。
二、堆棧操作指令
1壓棧指令
(1) 格式:PUSH SRC
功能:將源操作數(shù)壓下堆棧,源操作數(shù)同意為16位或32位通用寄存器、存儲(chǔ)器和馬上數(shù)以及16位段寄存器。當(dāng)操作數(shù)數(shù)據(jù)類型為字類型,壓棧操作使SP值減2;當(dāng)數(shù)據(jù)類型為雙字類型,壓棧操作使SP值減4。
例 3.19
PUSH AX ;通用寄存器操作數(shù)入棧(16位)
PUSH EBX ;通用寄存器操作數(shù)入棧(32位)
PUSH [SI] ;存儲(chǔ)器操作數(shù)入棧(16位)
PUSH DWORD PTR [DI] ;存儲(chǔ)器操作數(shù)入棧(32位)
PUSHW 0A123H ;馬上數(shù)入棧(16位)
PUSHD 20H ;馬上數(shù)入棧(32位)
(2) 格式:PUSHA
PUSHAD
功能:PUSHA將16位通用寄存器壓入堆棧,壓棧順序?yàn)锳X,CX,DX,BX,SP,BP,SI,DI。
PUSHAD將32位通用寄存器壓入堆棧,壓棧順序?yàn)镋AX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
2出棧指令
(1) 格式:POP DEST
功能:從棧頂彈出操作數(shù)送入目的操作數(shù)。目的操作數(shù)同意為16或32位通用寄存器、存儲(chǔ)器和16位段寄存器。當(dāng)操作數(shù)數(shù)據(jù)類型為字類型,出棧操作使SP加2;當(dāng)操作數(shù)數(shù)據(jù)類型為雙字類型,出棧操作使SP加4。
例 3.20
POP AX ;操作數(shù)出棧送寄存器(16位)
POP ECX ;操作數(shù)出棧送寄存器(32位)
POP [BX] ;操作數(shù)出棧送存儲(chǔ)器(16位)
POP DWORD PTR [SI] ;操作數(shù)出棧送存儲(chǔ)器(32位)
(2) 格式:POPA
POPAD
功能:POPA從堆棧移出16字節(jié)數(shù)據(jù),而且按順序存入寄存器DI,SI,BP,SP,BX,DX,CX,AX中。
POPAD從堆棧移出32字節(jié)數(shù)據(jù),而且按順序存入寄存器EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中。
使用堆棧操作指令應(yīng)注意下面問題。
(1) 目的操作數(shù)不同意為CS以及馬上數(shù)。
(2) 堆棧操作指令不影響標(biāo)志位。
三、地址傳送指令
(1) 格式:LEA REG,MEM
功能:將源操作數(shù)的有效地址傳送到通用寄存器,操作數(shù)REG為16位或32位通用寄存器,源操作數(shù)為16位或32位存儲(chǔ)器操作數(shù)。
例 3.21
LEA BX,BLOCK;將BLOCK的有效地址傳送到BX中(16位)
LEA EAX,/[EBX/];將EBX內(nèi)容(有效地址)傳送到EAX中(32位)
(2) 格式LDS(ES,FS,GS,SS)REG,MEM
功能:依據(jù)源操作數(shù)指定的偏移地址,在數(shù)據(jù)段中取出段地址和偏移地址分別送指定的段寄存器和指定的通用寄存器。
例 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
地址傳送指令對(duì)標(biāo)志位無影響。
四、標(biāo)志寄存器傳送指令
(1) 格式:LAHF
SAHF
功能:LAHF將標(biāo)志寄存器中低8位送AH中。SAHF將AH中內(nèi)容送標(biāo)志寄存器中低8位。
(2) 格式:PUSHF
POPF
功能:PUSHF將標(biāo)志寄存器低16位內(nèi)容壓入堆棧,SP←SP-2。POPF將當(dāng)前棧頂一個(gè)字傳送到標(biāo)志寄存器低16位中,SP←SP+2。
(3) 格式:PUSHFD
POPFD
功能:PUSHFD將標(biāo)志寄存器32位內(nèi)容壓入堆棧SP←SP-4。POPFD將當(dāng)前棧頂一個(gè)雙字傳送到32位標(biāo)志寄存器中,SP←SP+4。
上述SAHF,POPF,POPFD均影響相應(yīng)的標(biāo)志寄存器內(nèi)容。
五、查表指令
格式:XLAT
功能:將寄存器AL中的內(nèi)容轉(zhuǎn)換成存儲(chǔ)器表格中的相應(yīng)值。實(shí)現(xiàn)直接查表功能。
XLAT指令規(guī)定:BX寄存器存放表的首地址,AL寄存器中存放表內(nèi)偏移量,運(yùn)行XLAT指令,以段寄存器DS的內(nèi)容為段基址,有效地址為BX和AL內(nèi)容之和,取出表中一個(gè)字節(jié)內(nèi)容送AL中。
例 3.24內(nèi)存中有一起始地址為TABLE的編碼表,試編程將表中順序號(hào)為4的存儲(chǔ)單元內(nèi)容送寄存器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 ;結(jié)果在AL中,AL=55H
·EXIT
END
查表指令不影響標(biāo)志位。
六、符號(hào)擴(kuò)展指令
(1) 格式:CBW
功能:將AL中8位帶符號(hào)數(shù),進(jìn)行帶符號(hào)擴(kuò)展為16位,送AX中。帶符號(hào)擴(kuò)展是指對(duì)正數(shù)高位擴(kuò)展為全“0”,對(duì)負(fù)數(shù)高位擴(kuò)展為全“1”。
例 3.25AL=55H 經(jīng)CBW擴(kuò)展后 AX=0055H
AL=A5H 經(jīng)CBW擴(kuò)展后 AX=FFA5H
(2) 格式:CWD
功能:將AX中16位帶符號(hào)數(shù),進(jìn)行帶符號(hào)擴(kuò)展為32位,送DX和AX中。高16位送DX中,低16位送AX中。
(3) 格式:CWDE
功能:將AX中16位帶符號(hào)數(shù),進(jìn)行帶符號(hào)擴(kuò)展為32位,送EAX中。
(4) 格式:CDQ
功能:將EAX中32位帶符號(hào)數(shù),進(jìn)行帶符號(hào)擴(kuò)展為64位,送EDX和EAX中。低32位送EAX中,高32位送EDX中。
符號(hào)擴(kuò)展指令對(duì)標(biāo)志位無影響。
3.3.2 算術(shù)運(yùn)算指令
80x86指令包含加、減、乘、除四種基本算術(shù)運(yùn)算操作及十進(jìn)制算術(shù)運(yùn)算調(diào)整指令。二進(jìn)制加、減法指令,帶符號(hào)操作數(shù)採(cǎi)用補(bǔ)碼表示時(shí),無符號(hào)數(shù)和帶符號(hào)數(shù)據(jù)運(yùn)算能夠使用同樣的指令。二進(jìn)制乘、除法指令分帶符號(hào)數(shù)和無符號(hào)數(shù)運(yùn)算指令。
一、加法指令
格式:ADDDEST,SRC
ADCDEST,SRC
功能:ADD是將源操作數(shù)與目的操作數(shù)相加,結(jié)果傳送到目的操作數(shù)。ADC是將源操作數(shù)與目的操作數(shù)以及CF(低位進(jìn)位)值相加,結(jié)果傳送到目的操作數(shù)。
源操作數(shù)能夠是通用寄存器、存儲(chǔ)器或馬上數(shù)。目的操作數(shù)能夠是通用寄存器或存儲(chǔ)器操作數(shù)。
ADD,ADC指令影響標(biāo)志位為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將目的操作數(shù)減源操作數(shù),結(jié)果送目的操作數(shù)。SBB將目的操作數(shù)減源操作數(shù),還要減CF(低位借位)值,結(jié)果送目的操作數(shù)。
源操作數(shù)能夠是通用寄存器、存儲(chǔ)器或馬上數(shù)。目的操作數(shù)能夠是通用寄存器或存儲(chǔ)器操作數(shù)。
SUB,SBB指令影響標(biāo)志位為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指令將目的操作數(shù)加1,結(jié)果送目的操作數(shù)。DEC指令將目的操作數(shù)減1,結(jié)果送目的操作數(shù)。目的操作數(shù)為通用寄存器或存儲(chǔ)器操作數(shù)。
INC,DEC指令影響標(biāo)志位為OF,SF,ZF,AF,PF。
例 3.28
INC BL;BL←BL+1
INC AX;AX←AX+1
INC WORDPTR [BX];存儲(chǔ)器操作數(shù)加1
DEC BYTE PTR [SI];存儲(chǔ)器操作數(shù)減1
DEC EAX;EAX←EAX-1
四、比較指令
(1) 格式:CMP DEST,SRC
功能:目的操作數(shù)減源操作數(shù),結(jié)果不回送。源操作數(shù)為通用寄存器、存儲(chǔ)器和馬上數(shù)。目的操作數(shù)為通用寄存器、存儲(chǔ)器操作數(shù)。
CMP指令影響標(biāo)志位為OF,SF,ZF,AF,PF,CF。
例 3.29
CMP CX,3
CMP WORD PTR [SI],3
CMP AX,BLOCK
運(yùn)行比較指令后,對(duì)狀態(tài)標(biāo)志位影響見表3.2。對(duì)于兩個(gè)數(shù)的比較(AX-BX)有下面3種情況。
表 3.2 CMP指令對(duì)標(biāo)志位的影響
· 兩個(gè)正數(shù)比較,使用SF標(biāo)志位推斷。
SF=0,則AX≥BX,若ZF=1,則AX=BX
SF=1,則AX<BX
· 兩個(gè)無符號(hào)數(shù)比較,使用CF標(biāo)志位推斷。
CF=0,則AX≥BX,若ZF=1,則AX=BX
CF=1,則AX<BX
· 兩個(gè)負(fù)數(shù)比較,使用SF標(biāo)志位推斷。
SF=0,則AX≥BX,若ZF=1,則AX=BX
SF=1,則AX<BX
· 兩個(gè)異符號(hào)數(shù)比較。
假設(shè)OF=0,仍可用SF標(biāo)志推斷大小。
假設(shè)OF=1,說明結(jié)果的符號(hào)位錯(cuò)誤發(fā)生,所以
SF=0,則AX<BX
SF=1,則AX>BX
綜上所述:兩個(gè)異號(hào)數(shù)比較
當(dāng)OF=0,SF=0,則AX>BX
SF=1,則AX<BX
當(dāng)OF=1,SF=0,則AX<BX
SF=1,則AX>BX
用邏輯表達(dá)式表示為:
若OF∨-SF=0,則AX>BX
若OF∨-SF=1,則AX<BX
(2) 格式:CMPXCHGDEST,REG
功能:目的操作數(shù)減源操作數(shù),
假設(shè)DEST=SRC,則SRC→DEST。
假設(shè)DEST≠SRC,則DEST→ACC(AL,AX,EAX)。
源操作數(shù)同意為通用寄存器。目的操作數(shù)能夠?yàn)橥ㄓ眉拇嫫?#xff0c;存儲(chǔ)器操作數(shù)。
CMPXCHG影響標(biāo)志位為OF,SF,ZF,AF,PF,CF。
(3) 格式:CMPXCHG8BMEM
功能:EDX:EAX中值減存儲(chǔ)器操作數(shù)。
假設(shè)EDX:EAX=MEM64,則ECX:EBX→MEM64。
假設(shè)EDX:EAX≠M(fèi)EM64,則MEM64→EDX:EAX。
該指令為64位比較交換指令,影響ZF標(biāo)志位。
例 3.30 CMPXCHG8BQWORDPTR[EBX]
五、交換相加指令
格式:XADDDEST,REG
功能:目的操作數(shù)加源操作數(shù),結(jié)果送目的操作數(shù)。原目的操作數(shù)內(nèi)容送源操作數(shù)。源操作數(shù)同意為通用寄存器。目的操作數(shù)同意為通用寄存器、存儲(chǔ)器操作數(shù)。
XADD指令影響標(biāo)志位為OF,SF,ZF,AF,PF,CF。
六、求補(bǔ)指令
格式:NEGDEST
功能:對(duì)目的操作數(shù)求補(bǔ),用零減去目的操作數(shù),結(jié)果送目的操作數(shù)。目的操作數(shù)為通用寄存器、存儲(chǔ)器操作數(shù)。
NEG指令影響標(biāo)志位為OF,SF,ZF,AF,PF,CF。
七、乘法指令
(1) 格式:MULSRC
IMULSRC
功能:MUL為無符號(hào)數(shù)乘法指令,IMUL為帶符號(hào)數(shù)乘法指令。源操作數(shù)為通用寄存器或存儲(chǔ)器操作數(shù)。目的操作數(shù)缺省存放在ACC(AL,AX,EAX)中,乘積存AX,DX:AX,EDX:EAX中。
字節(jié)乘:ALSRC→AX
字乘:AXSRC→DX∶AX
雙字乘:EAXSRC→EDX∶EAX
MUL,IMUL指令運(yùn)行后,CF=OF=0,表示乘積高位無有效數(shù)據(jù);CF=OF=1表示乘積高位含有效數(shù)據(jù),對(duì)其他標(biāo)志位無定義。
例 3.31
MUL BL;字節(jié)乘
MUL WORD PTR [SI];字乘
IMUL BYTE PTR [DI];字節(jié)乘
IMUL DWORD PTR [ECX];雙字乘
假設(shè)使用IMUL指令,積採(cǎi)用補(bǔ)碼形式表示。
(2) 格式:IMULDEST,SRC
功能:將目的操作數(shù)乘以源操作數(shù),結(jié)果送目的操作數(shù)。目的操作數(shù)為16位或32位通用寄存器或存儲(chǔ)器操作數(shù)。源操作數(shù)為16位或32位通用寄存器、存儲(chǔ)器或馬上數(shù)。
源操作數(shù)和目的操作數(shù)數(shù)據(jù)類型要求一致。乘積僅取和目的操作數(shù)同樣的位數(shù),高位部分將被舍去,而且CF=OF=1。其他標(biāo)志位無定義。
(3) 格式:IMUL DEST,SRC1,SRC2
功能:將源操作數(shù)SRC1與源操作數(shù)SRC2相乘,結(jié)果送目的操作數(shù)。目的操作數(shù)DEST為16位或32位,同意為通用寄存器。源操作數(shù)SRC1為16位或32位通用寄存器或存儲(chǔ)器操作數(shù)。源操作數(shù)SRC2同意為馬上數(shù)。
例 3.32 IMULEAX,[EBX],12H
要求目的操作數(shù)和源操作數(shù)SRC1類型同樣,當(dāng)乘積超出目的操作數(shù)部分,將被舍去,而且使CF=OF=1,在使用這類指令時(shí),需在IMUL指令后加一條推斷溢出的指令,溢出時(shí)轉(zhuǎn)錯(cuò)誤處理運(yùn)行程序。
八、除法指令
格式:DIV SRC
IDIV SRC
功能:DIV為無符號(hào)數(shù)除法,IDIV為帶符號(hào)數(shù)除法。源操作數(shù)作為除數(shù),為通用寄存器或存儲(chǔ)器操作數(shù)。被除數(shù)缺省在目的操作數(shù)AX,DX:AX,EDX:EAX中。
字節(jié)除法:AX/SRC商→AL,余數(shù)→AH
字除法:DX·AX/SRC商→AX,余數(shù)→DX
雙字除法:EDX·EAX/SRC商→EAX,余數(shù)→EDX
因?yàn)楸怀龜?shù)必須是除數(shù)的雙倍字長(zhǎng),一般應(yīng)使用擴(kuò)展指令進(jìn)行高位擴(kuò)展。當(dāng)進(jìn)行無符號(hào)數(shù)除法時(shí),被除數(shù)高位按0擴(kuò)展為雙倍除數(shù)字長(zhǎng)。當(dāng)進(jìn)行有符號(hào)數(shù)除法時(shí),被除數(shù)以補(bǔ)碼表示。可使用擴(kuò)展指令CBW,CWD,CWDE,CDQ進(jìn)行高位擴(kuò)展。比如:
MOV AX,BLOCK
CWD;被除數(shù)高位擴(kuò)展
MOV BX,1000H
IDIV BX
對(duì)于帶符號(hào)除法,其商和余數(shù)均採(cǎi)用補(bǔ)碼形式表示,余數(shù)與被除數(shù)同符號(hào)。當(dāng)除數(shù)為零或商超過了規(guī)定數(shù)據(jù)類型所能表示的范圍時(shí),將會(huì)出現(xiàn)溢出現(xiàn)象,產(chǎn)生一個(gè)中斷類型碼為“0”的中斷。運(yùn)行除法指令后標(biāo)志位無定義。
九、BCD算術(shù)運(yùn)算
十進(jìn)制數(shù)在機(jī)器中採(cǎi)用BCD碼表示,以壓縮格式存放,即一個(gè)字節(jié)存儲(chǔ)2位BCD碼,BCD加減法是在二進(jìn)制加減運(yùn)算的基礎(chǔ)上,對(duì)其二進(jìn)制結(jié)果進(jìn)行調(diào)整,將結(jié)果調(diào)整成BCD碼表示形式。
(1) 格式:DAA
功能:將存放在AL中的二進(jìn)制和數(shù),調(diào)整為壓縮格式的BCD碼表示形式。
調(diào)整方法:若AL中低4位大于9或標(biāo)志AF=1(表示低4位向高4位有進(jìn)位),則
AL+6→AL,1→AF,
若AL中高4位大于9,或標(biāo)志CF=1,(表示高4位有進(jìn)位),則
AL+60H→AL,1→CF,
DAA指令一般緊跟在ADD或ADC指令之后使用,影響標(biāo)志位為SF,ZF,AF,PF,CF。OF無定義。
例 3.33
ADD AL,BL
DAA
(2) 格式:DAS
功能:將存放在AL中的二進(jìn)制差數(shù),調(diào)整為壓縮的BCD碼表示形式。
調(diào)整方法:若AL中低4位大于9或標(biāo)志AF=1(表示低4位向高位借位),則
AL-6→AL,1→AF
若AL中高4位大于9或標(biāo)志CF=1(表示高4位向高位借位),則
AL-60H→AL,1→CF
DAS指令一般緊跟在SUB或SBB指令之后使用,影響標(biāo)志位為SF,ZF,AF,PF,CF。OF無定義。
例 3.34
SUB AL,BL
DAS
十、ASCII算術(shù)運(yùn)算
數(shù)字0~9的ASCII碼為30H~39H,機(jī)器採(cǎi)用一個(gè)字節(jié)存放一位ASCII碼,對(duì)于ASCII碼的算術(shù)運(yùn)算是在二進(jìn)制運(yùn)算基礎(chǔ)上進(jìn)行調(diào)整。調(diào)整指令有加、減、乘、除四種調(diào)整指令。
(1) 格式:AAA
功能:將存放在AL中的二進(jìn)制和數(shù),調(diào)整為ASCII碼表示的結(jié)果。
調(diào)整方法:若AL中低4位小于或等于9,僅AL中高4位清0,AF→CF。若AL中低4位大于9或標(biāo)志AF=1(進(jìn)位),則AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。
AAA指令一般緊跟在ADD或ADC指令之后使用,影響標(biāo)志位為AF,CF。其他標(biāo)志位無定義。
例 3.35
MOV AX,0036H
ADD,AL,35H
AAA;AX=0101H
(2) 格式:AAS
功能:將存放在AL中的二進(jìn)制差數(shù),調(diào)整為ASCII碼表示形式
調(diào)整方法:若AL中低4位小于等于9,僅AL中高4位清0,AF→CF。若AL中低4位大于9或標(biāo)志AF=1,則AL-6→AL,AH-1→AH,1→AF,AF→CF,AL中高4位清0。
AAS指令一般緊跟在SUB,SBB指令之后使用,影響標(biāo)志位為AF,CF。其他標(biāo)志位無定義。
例 3.36
MOV AX,0132H
SUB AL,35H
AAS;AX=0007H
(3) 格式:AAM
功能:將存放在AL中的二進(jìn)制積數(shù),調(diào)整為ASCII碼表示形式。
調(diào)整方法:AL/10商→AH,余數(shù)→AL
AAM指令一般緊跟在MUL指令之后使用,影響標(biāo)志位為SF,ZF,PF。其他標(biāo)志位無定義。
例 3.37
MOV AL,07H
MOV BL,09H
MUL BL;AX=003FH
AAM;AX=0603H
(4) 格式:AAD
功能:將AX中兩位非壓縮BCD碼(一個(gè)字節(jié)存放一位BCD碼),轉(zhuǎn)換為二進(jìn)制數(shù)的表示形式。
調(diào)整方法:AH10+AL→AL0→AH
AAD指令用于二進(jìn)制除法DIV操作之前,影響的標(biāo)志位為SF,ZF,PF。其他標(biāo)志位無定義。
例 3.38
MOV AX,0605H
MOV BL,09H
AAD;AX=0041H
DIV BL;AX=0207H
使用該類指令應(yīng)注意,加法、減法和乘法調(diào)整指令都是緊跟在算術(shù)運(yùn)算指令之后,將二進(jìn)制的運(yùn)算結(jié)果調(diào)整為非壓縮BCD碼表示形式,而除法調(diào)整指令必須放在除法指令之前進(jìn)行,以避免除法出現(xiàn)錯(cuò)誤的結(jié)果。
使用算術(shù)運(yùn)算類指令應(yīng)注意:
·假設(shè)沒有特別規(guī)定,參與運(yùn)算的兩個(gè)操作數(shù)數(shù)據(jù)類型必須一致,且僅僅同意一個(gè)為存儲(chǔ)器操作數(shù);
·假設(shè)參與運(yùn)算的操作數(shù)僅僅有一個(gè),且為存儲(chǔ)器操作數(shù),必須使用PTR偽指令說明數(shù)據(jù)類型;
·操作數(shù)不同意為段寄存器。
·目的操作數(shù)不同意為馬上數(shù);
·假設(shè)是存儲(chǔ)器尋址,則存儲(chǔ)器各種尋址方式均可使用。
3.3.3邏輯運(yùn)算指令
一、邏輯指令
1邏輯與指令
格式:AND DEST,SRC
功能:目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯與運(yùn)算,結(jié)果存目的操作數(shù)中。源操作數(shù)能夠是通用寄存器、存儲(chǔ)器或馬上數(shù)。目的操作數(shù)能夠是通用寄存器或存儲(chǔ)器操作數(shù)。
例 3.39
AND AL,BL
AND EBX,ECX
AND [DI],1101H
AND指令經(jīng)常使用于將操作數(shù)中某位清0(稱屏蔽),僅僅須將要清0的位與0,其他不變的位與1就可以。
例 3.40 AND AL,0FH;將AL中高4位清0,低4位保持不變。
AND指令影響標(biāo)志位為SF,ZF,PF,而且使OF=CF=0。
2邏輯或指令
格式:OR DEST,SRC
功能:目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯或運(yùn)算,結(jié)果存目的操作數(shù)中。源操作數(shù)能夠是通用寄存器、存儲(chǔ)器或馬上數(shù)。目的操作數(shù)能夠是通用寄存器或存儲(chǔ)器操作數(shù)。
例 3.41
OR AX,BX
OR ECX,[EAX]
OR指令經(jīng)常使用于將操作數(shù)中某位置1,僅僅須將要置1的位或1,其他不改變的位或0就可以。
例 3.42 OR AL,80H;將AL中最高位置1。
OR指令影響標(biāo)志位為SF,ZF,PF。而且使OF=CF=0。
3邏輯異或指令
格式:XOR DEST,SRC
功能:目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯異或運(yùn)算,結(jié)果送目的操作數(shù)。源操作數(shù)能夠是通用寄存器、存儲(chǔ)器或馬上數(shù)。目的操作數(shù)能夠是通用寄存器或存儲(chǔ)器操作數(shù)。
例 3.43
XOR AX,BX
XOR [BX],1010H
XOR指令經(jīng)常使用于將操作數(shù)中某些位取反,僅僅須將要取反的位異或1,其他不改變的位異或0就可以。
例 3.44 XOR AL,OFH;將AL中低4位取反,高4位保持不變。
XOR指令影響標(biāo)志位為SF,ZF,PF,而且使OF=CF=0。
4邏輯非指令
格式:NOT DEST
功能:對(duì)目的操作數(shù)按位取反,結(jié)果回送目的操作數(shù)。目的操作數(shù)能夠?yàn)橥ㄓ眉拇嫫骰虼鎯?chǔ)器。
例 3.45
NOT EAX
NOT BYTE PTR [BX]
NOT指令對(duì)標(biāo)志位無影響。
5測(cè)試指令
格式:TEST DEST,SRC
功能:目的操作數(shù)和源操作數(shù)按位進(jìn)行邏輯與操作,結(jié)果不回送目的操作數(shù)。源操作數(shù)能夠?yàn)橥ㄓ眉拇嫫鳌⒋鎯?chǔ)器或馬上數(shù)。目的操作數(shù)能夠?yàn)橥ㄓ眉拇嫫骰虼鎯?chǔ)器操作數(shù)。
例 3.46
TEST DWORD PTR [BX],80000000H
TEST AL,CL
TEST指令經(jīng)常使用于測(cè)試操作數(shù)中某位是否為1,并且不會(huì)影響目的操作數(shù)。假設(shè)測(cè)試某位的狀態(tài),對(duì)某位進(jìn)行邏輯與1的運(yùn)算,其他位邏輯與0,然后推斷標(biāo)志位。運(yùn)算結(jié)果為0,ZF=1,表示被測(cè)試位為0;否則ZF=0,表示被測(cè)試位為1。
例 3.47 TEST AL,80H;測(cè)試AL中最高位
JNZ NEXT;假設(shè)最高位為1,轉(zhuǎn)到標(biāo)志NEXT處。
TEST指令影響標(biāo)志位為SF,ZF,PF,并且使OF=CF=0。
二、移位指令
移位指令對(duì)操作數(shù)按某種方式左移或右移,移位位數(shù)能夠由馬上數(shù)直接給出,或由CL間接給出。移位指令分一般移位指令和循環(huán)移位指令。
1一般移位指令
(1) 算術(shù)/邏輯左移指令。
格式:SAL DEST,OPRD
SHL DEST,OPRD
功能:依照操作數(shù)OPRD規(guī)定的移位位數(shù),對(duì)目的操作數(shù)進(jìn)行左移操作,最高位移入CF中。每移動(dòng)一位,右邊補(bǔ)一位0。如圖312(a)所看到的。目的操作數(shù)能夠?yàn)橥ㄓ眉拇嫫骰虼鎯?chǔ)器操作數(shù)。
SAL,SHL指令影響標(biāo)志位OF,SF,ZF,PF,CF。
圖 3.12 移位指令示意圖
例 3.48
SHL BYTE PTR [DI],2
SAL BX,CL
(2) 算術(shù)右移指令。
格式:SAR DEST,OPRD
功能:依照操作數(shù)OPRD規(guī)定的移位次數(shù),對(duì)目的操作數(shù)進(jìn)行右移操作,最低位移至CF中,最高位(即符號(hào)位)保持不變。如圖312(b)所看到的。目的操作數(shù)能夠?yàn)橥ㄓ眉拇嫫骰虼鎯?chǔ)器操作數(shù)。
SAR指令影響標(biāo)志位OF,SF,ZF,PF,CF。
例 3.49
SAR AL,5
SAR WORD PTR /[ECX/],CL
(3) 邏輯右移指令。
格式:SHR DEST,SRC
功能:依照操作數(shù)OPRD規(guī)定的移位位數(shù),對(duì)目的操作數(shù)進(jìn)行右移操作,最低位移至CF中。每移動(dòng)一位,左邊補(bǔ)一位0。如圖312(c)所看到的,目的操作數(shù)能夠?yàn)橥ㄓ眉拇嫫骰虼鎯?chǔ)器操作數(shù)。
SHR指令影響標(biāo)志位OF,SF,ZF,PF,CF。
例 3.50
SHR BYTE PTR [SI],3
SHR EDX,CL
算術(shù)/邏輯左移,僅僅要結(jié)果未超出目的操作數(shù)所能表達(dá)的范圍,每左移一次相當(dāng)于原數(shù)乘2。算術(shù)右移僅僅要無溢出,每右移一次相當(dāng)于原數(shù)除以2。
2循環(huán)移位指令
格式:ROL DEST,OPRD
ROR DEST,OPRD
RCL DEST,OPRD
RCR DEST,OPRD
功能:循環(huán)左移指令ROL,見圖313(a)所看到的,目的操作數(shù)左移,每移位一次,其最高位移入最低位,同一時(shí)候最高位也移入進(jìn)位標(biāo)志CF。循環(huán)右移指令 ROR見圖313(b)所看到的,目的操作數(shù)右移,每移位一次,其最低位移入最高位,同一時(shí)候最低位也移入進(jìn)位標(biāo)志CF。
帶進(jìn)位循環(huán)左移指令RCL,見圖313(c)所看到的,目的操作數(shù)左移,每移動(dòng)一次,其最高位移入進(jìn)位標(biāo)志CF,CF移入最低位。帶進(jìn)位循環(huán)右移指令RCR,見圖313(d)所看到的,目的操作數(shù)右移,每移動(dòng)一次,其最低位移入進(jìn)位標(biāo)志CF,CF移入最高位。
圖 3.13 循環(huán)移位指令
目的操作數(shù)能夠?yàn)橥ㄓ眉拇嫫骰虼鎯?chǔ)器操作數(shù)。循環(huán)移位指令影響標(biāo)志位CF,OF。其他標(biāo)志位無定義。
例 3.51
ROL AL,CL
ROR BX,5
RCL ECX,3
RCR BYTE PTR [SI],CL
例 3.52 將一個(gè)2位數(shù)壓縮的BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)。
·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
功能:對(duì)于由目的操作數(shù)DEST和源操作數(shù)SRC構(gòu)成的雙精度數(shù),依照操作數(shù)OPRD給出的移位位數(shù),進(jìn)行移位。SHLD是對(duì)目的操作數(shù)進(jìn)行左移,如 圖314(a)所看到的,SHRD是對(duì)目的操作數(shù)進(jìn)行右移,如圖314(b)所看到的。先移出位送標(biāo)志位CF,還有一端空出位由SRC移入DEST中,而SRC 內(nèi)容保持不變。目的操作數(shù)能夠是16位或32位通用寄存器或存儲(chǔ)器操作數(shù)。源操作數(shù)SRC同意為16位或32位通用寄存器。操作數(shù)OPRD能夠?yàn)轳R上數(shù)或 CL。目的操作數(shù)和源操作數(shù)SRC數(shù)據(jù)類型必須一致。
圖 3.14 雙精度移位指令
SHLD,SHRD指令經(jīng)常使用于位串的高速移位、嵌入和刪除等操作,影響標(biāo)志位為SF,ZF,PF,CF,其他標(biāo)志位無定義。
三、位操作指令
位操作指令包含位測(cè)試和位掃描指令,能夠直接對(duì)一個(gè)二進(jìn)制位進(jìn)行測(cè)試,設(shè)置和掃描。
1位測(cè)試和設(shè)置指令
格式:BT DEST,SRC
BTC DEST,SRC
BTR DEST,SRC
BTS DEST,SRC
功能:依照源操作指定的位號(hào),測(cè)試目的操作數(shù),當(dāng)指令運(yùn)行時(shí),被測(cè)試位的狀態(tài)被拷貝到進(jìn)位標(biāo)志CF。
BT將SRC指定的DEST中一位的數(shù)值拷貝到CF。BTC將SRC指定的DEST中一位的數(shù)值拷貝到CF,且將DEST中該位取反。BTR將SRC 指定的DEST中一位的數(shù)值拷貝到CF,且將DEST中該位復(fù)位。BTS將SRC指定的DEST中一位的數(shù)值拷貝到CF,且將DEST中該位置位。
目的操作數(shù)為16位或32位通用寄存器或存儲(chǔ)器,源操作數(shù)為16位或32位通用寄存器,以及8位馬上數(shù),當(dāng)源操作數(shù)為通用寄存器時(shí),必須同目的操作數(shù)類型一致。源操作數(shù)SRC以兩種方式給出目的操作數(shù)的位號(hào),即
· SRC為8位馬上數(shù),以二進(jìn)制形式直接給出要操作的位號(hào);
· SRC為通用寄存器,假設(shè)DEST為通用寄存器,則SRC中二進(jìn)制值直接給出要操作的位號(hào)。假設(shè)DEST為存儲(chǔ)器操作數(shù),通用寄存器SRC為帶符號(hào)整數(shù), SRC的值除以DEST的長(zhǎng)度所得到的商作為DEST的相對(duì)偏移量,余數(shù)直接作為要操作的位號(hào)。DEST的有效地址為DEST給出的偏移地址和DEST相 對(duì)偏移量之和。
BT,BTC,BTR,BTS指令影響CF標(biāo)志位,其他標(biāo)志位無定義。
例 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從低位開始掃描源操作數(shù),若全部位都是0,則ZF=0,否則ZF=1。而且將第一個(gè)出現(xiàn)1的位號(hào)存入目的操作數(shù)。BSR從高位開始掃描源操作數(shù),若全部位都是0,則ZF=0,否則ZF=1。而且將第一個(gè)出現(xiàn)1的位號(hào)存入目的操作數(shù)。
源操作數(shù)能夠?yàn)?6位32位通用寄存器或存儲(chǔ)器。目的操作數(shù)為16位或32位通用寄存器。源操作數(shù)和目的操作數(shù)類型必須一致。
BSF,BSR指令影響ZF標(biāo)志位,其他標(biāo)志位無定義。
例 3.55
MOV EBX,0F333EE00H
BSR EAX,EBX;ZF=1EAX=0000001FH=31
BSF EDX,EBX;ZF=1EDX=00000009H
3進(jìn)位標(biāo)志指令
(1) 格式:CLC。功能:清除進(jìn)位標(biāo)志。
(2) 格式:STC。功能:設(shè)置進(jìn)位標(biāo)志。
(3) 格式:CMC。功能:進(jìn)位標(biāo)志取反。
4條件設(shè)置字節(jié)指令
條件設(shè)置指令用于依據(jù)條件設(shè)置某一狀態(tài)字節(jié)或標(biāo)志字節(jié),見表33。
格式:SETcondDEST
功能:測(cè)試條件(cond)若為真,則將目的操作數(shù)置01H,否則置00H。目的操作數(shù)同意為8位通用寄存器或8位存儲(chǔ)器操作數(shù)。
條件cond與條件轉(zhuǎn)移指令中的條件同樣,共分三類。
(1) 以標(biāo)志位狀態(tài)為條件能夠測(cè)試的標(biāo)志位為ZF,SF,OF,CF,PF。
(2) 以兩個(gè)無符號(hào)數(shù)比較為條件條件為高于、高于等于、低于、低于等于。
(3) 以兩個(gè)帶符號(hào)數(shù)比較為條件條件為大于、大于等于、小于、小于等于。
SET指令不影響標(biāo)志位。
使用邏輯運(yùn)算類指令應(yīng)注意:
· 假設(shè)沒有特別規(guī)定,參與運(yùn)算的兩個(gè)操作數(shù)類型必須一致,且僅僅同意一個(gè)為存儲(chǔ)器操作數(shù);
· 假設(shè)參與運(yùn)算的操作數(shù)僅僅有一個(gè),且為存儲(chǔ)器操作數(shù),必須使用PTR偽指令說明其數(shù)據(jù)類型;
· 操作數(shù)不同意為段寄存器;
· 目的操作數(shù)不同意為馬上數(shù);
· 假設(shè)是存儲(chǔ)器尋址,則前面介紹的各種存儲(chǔ)器尋址方式均可使用。
表 3.3 條件設(shè)置字節(jié)指令
3.3.4控制轉(zhuǎn)移類指令
計(jì)算機(jī)運(yùn)行程序通常是順序地逐條運(yùn)行指令。但常常須要依據(jù)不同條件做不同的處理,有時(shí)須要跳過幾條指令,有時(shí)須要反復(fù)運(yùn)行某段程序,或者轉(zhuǎn)移到還有一個(gè)程序段去運(yùn)行。用于控制程序流程的指令包含轉(zhuǎn)移、循環(huán)、過程調(diào)用和中斷調(diào)用。
一、轉(zhuǎn)移指令
1無條件轉(zhuǎn)移指令
格式:JMP TARGET
功能:使程序無條件地轉(zhuǎn)移到指令規(guī)定的目的地址TARGET去運(yùn)行指令。轉(zhuǎn)移分為短轉(zhuǎn)移、段內(nèi)轉(zhuǎn)移(近程轉(zhuǎn)移)和段間轉(zhuǎn)移(遠(yuǎn)程轉(zhuǎn)移)。
(1) 段內(nèi)直接轉(zhuǎn)移:
格式:JMP SHORT TARGET;短轉(zhuǎn)移
JMP NEAR PTR TARGET;近程轉(zhuǎn)移
功能:採(cǎi)用相對(duì)尋址將當(dāng)前IP值(即JMP指令下一條指令的地址)與JMP指令中給出的偏移量之和送IP中。段內(nèi)短轉(zhuǎn)移(SHORT)指令偏移量為8 位,同意轉(zhuǎn)移偏移值的范圍為-128~+127。段內(nèi)近程轉(zhuǎn)移(NEAR)指令在16位指令模式下,偏移量為16位,同意轉(zhuǎn)移偏移值范圍為-215~+ 215-1。在32位指令模式下,偏移值范圍為-231~+231-1。
例 3.56
JMP NEXT
NEXT:MOV AL,BL
本例為無條件轉(zhuǎn)移到本段內(nèi),標(biāo)號(hào)為NEXT的地址去運(yùn)行指令,匯編程序能夠確定目的地址與JMP指令的距離。
(2) 段內(nèi)間接轉(zhuǎn)移:
格式:JMP REG
JMP NEAR PTR [REG]
功能:段內(nèi)間接轉(zhuǎn)移,當(dāng)中JMP REG指令地址在通用寄存器中,將其內(nèi)容直接送IP實(shí)現(xiàn)程序轉(zhuǎn)移。JMP NEAR PTR [REG]指令地址在存儲(chǔ)器中,默認(rèn)段寄存器依據(jù)參與尋址的通用寄存器來確定,將指定存儲(chǔ)單元的字取出直接送IP實(shí)現(xiàn)程序轉(zhuǎn)移。在16位指令模式,轉(zhuǎn)移偏 移值范圍為。在32位指令模式,轉(zhuǎn)移偏移值范圍為。
例 3.57 設(shè)DS=1000HEBX=00002000H。
JMP BX ;將2000H送IP
JMP NEAR PTR [BX] ;將地址1000∶2000單元存放的一個(gè)字送IP
JMP NEAR PTR [EBX] ;將段選擇符為1000H,偏移地址為00002000H單元存放的雙字送EIP。
(3) 段間直接轉(zhuǎn)移:
格式:JMP FAR PTR TARGET
功能:段間直接轉(zhuǎn)移,FAR PTR說明標(biāo)號(hào)TARGET具有遠(yuǎn)程屬性。將指令中由TARGET指定的段值送CS,偏移地址送IP。
例 3.58 JMP FAR PTR NEXT。
在16位指令模式下,段基地送CS,偏移地址為16位,轉(zhuǎn)移偏移值范圍;在32位指令模式下,代碼段選擇符送CS,偏移地址為32位,轉(zhuǎn)移偏移值范圍為。
(4) 段間間接轉(zhuǎn)移:
格式:JMP FAR PTR [Reg]
功能:段間間接轉(zhuǎn)移,由FAR PTR [Reg]指定的存儲(chǔ)器操作數(shù)作為轉(zhuǎn)移地址。
在16位指令模式下,存儲(chǔ)器操作數(shù)為32位,包含16位段基址和16位偏移地址。
例 3.59
JMP FAR PTR [BX] ;數(shù)據(jù)段雙字存儲(chǔ)單元低字內(nèi)容送IP
;數(shù)據(jù)段雙字存儲(chǔ)單元高字內(nèi)容送CS
在32位指令模式下,存儲(chǔ)器操作數(shù)包含16位選擇符。
例 3.60 JMP FAR PTR [EAX]
指令中包含指向目標(biāo)地址指針的門描寫敘述符或TSS描寫敘述符的指針,其所指的存儲(chǔ)器操作數(shù)中僅選擇符部分有效,指示調(diào)用門、任務(wù)門或TSS描寫敘述符起作用,而偏移部分不起作用。
2條件轉(zhuǎn)移指令
該類指令是依據(jù)上一條指令對(duì)標(biāo)志寄存器中標(biāo)志位的影響來決定程序運(yùn)行的流程,若滿足指令規(guī)定的條件,則程序轉(zhuǎn)移;否則程序順序運(yùn)行。
條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍為段內(nèi)短轉(zhuǎn)移或段內(nèi)近程轉(zhuǎn)移,不同意段間轉(zhuǎn)移。段內(nèi)短轉(zhuǎn)移(short)的轉(zhuǎn)移偏移值范圍為-128~+127。段內(nèi)近程轉(zhuǎn)移,在16位指令模式下轉(zhuǎn)移偏移值范圍為,在32位指令模式下轉(zhuǎn)移偏移值范圍為。
條件轉(zhuǎn)移指令包含四類:單標(biāo)志位條件轉(zhuǎn)移;無符號(hào)數(shù)比較條件轉(zhuǎn)移;帶符號(hào)數(shù)比較條件轉(zhuǎn)移;測(cè)試CX條件轉(zhuǎn)移。
格式:Jcc TARGET
功能:若測(cè)試條件‘CC’為真,則轉(zhuǎn)移到目標(biāo)地址TARGET處運(yùn)行程序。否則順序運(yùn)行。
(1) 單標(biāo)志位條件轉(zhuǎn)移指令,見表34。
例 3.61 JZ NEXT;若標(biāo)志ZF=1則轉(zhuǎn)移到標(biāo)號(hào)NEXT處運(yùn)行。
(2) 無符號(hào)數(shù)比較條件轉(zhuǎn)移,見表35。
例 3.62 JA NEXT;無符號(hào)數(shù)A與B比較,若A>B則轉(zhuǎn)移到標(biāo)號(hào)NEXT處運(yùn)行程序
表 3.4 單標(biāo)志位條件轉(zhuǎn)移指令
表 3.5 無符號(hào)數(shù)比較條件轉(zhuǎn)移指令
表 3.6 帶符號(hào)數(shù)比較條件轉(zhuǎn)移指令
例 3.63 JG NEXT;帶符號(hào)數(shù)A與B比較,若A>B則轉(zhuǎn)移到標(biāo)號(hào)NEXT。
(4) 測(cè)試CX條件轉(zhuǎn)移,見表37。
表 3.7 測(cè)試CX條件轉(zhuǎn)移指令
例 3.64 JCXZ TARGET;CX=0轉(zhuǎn)移到標(biāo)號(hào)TARGET處。
JECXZ TARGET;ECX=0轉(zhuǎn)移到標(biāo)號(hào)TARGET處。
條件轉(zhuǎn)移指令一般緊跟在CMP或TEST指令之后,推斷運(yùn)行CMP或TEST指令對(duì)標(biāo)志位的影響來決定是否轉(zhuǎn)移。
例 3.65 符號(hào)函數(shù)
如果x為某值且存放在寄存器AL中,試編程將求出的函數(shù)值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 編程實(shí)現(xiàn)把BX寄存器內(nèi)的二進(jìn)制數(shù)用十六進(jìn)制數(shù)的形式在屏幕上顯示出來。
·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
二、循環(huán)控制指令
這類指令用(E)CX計(jì)數(shù)器中的內(nèi)容控制循環(huán)次數(shù),先將循環(huán)計(jì)數(shù)值存放在(E)CX中,每循環(huán)一次(E)CX內(nèi)容減1,直到(E)CX為0時(shí)循環(huán)結(jié)束。
格式:LOOPcc TARGET
功能:將(E)CX內(nèi)容減1,不影響標(biāo)志位,若(E)CX不等于0,且測(cè)試條件‘CC’成立,則轉(zhuǎn)移到目標(biāo)地址TARGET處運(yùn)行程序。轉(zhuǎn)移范圍為-128~+127。如表38所看到的。
表3.8 循環(huán)控制指令
例 3.67 計(jì)算
·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個(gè)字?jǐn)?shù)組中的第一個(gè)非0項(xiàng),送AX寄存器中。
·MODELSMALL
·DATA
ARRAYDW 0,0,0,0,1010H,…;(100個(gè)字)
·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
關(guān)于過程調(diào)用和返回指令將在子程序一節(jié)中介紹。
3.3.5串操作指令
80x86提供處理字符串的操作。串指連續(xù)存放在存儲(chǔ)器中的一些數(shù)據(jù)字節(jié)、字或雙字。串操作同意程序?qū)B續(xù)存放大的數(shù)據(jù)塊進(jìn)行操作。
串操作通常以DS:(E)SI來尋址源串,以ES:(E)DI來尋址目的串,對(duì)于源串同意段超越。(E)SI或(E)DI這兩個(gè)地址指針在每次串操作 后,都自己主動(dòng)進(jìn)行改動(dòng),以指向串中下一個(gè)串元素。地址指針改動(dòng)是增量還是減量由方向標(biāo)志來規(guī)定。當(dāng)DF=0,(E)SI及(E)DI的改動(dòng)為增量;當(dāng)DF= 1,(E)SI及(E)DI的改動(dòng)為減量。依據(jù)串元素類型不同,地址指針增減量也不同,在串操作時(shí),字節(jié)類型SI,DI加、減1;字類型SI,DI加、減 2;雙字類型ESI,EDI加、減4。假設(shè)須要連續(xù)進(jìn)行串操作,通常加反復(fù)前綴。反復(fù)前綴能夠和不論什么串操作指令組合,形成復(fù)合指令,見表39。
一、反復(fù)前綴指令
表 3.9 反復(fù)前綴指令
二、方向標(biāo)志指令
格式:CLD/STD
功能:CLD為清除方向標(biāo)志,即將DF置‘0’。STD為設(shè)置方向標(biāo)志,即將DF置‘1’。
三、串傳送指令
基本格式:[REP]MOVS DESTS, SRCS
[REP] MOVSB/MOVSW/MOVSD
功能:將DS:(E)SI規(guī)定的源串元素拷貝到ES:(E)DI規(guī)定的目的串單元中,見表310。
表 3.10 MOVS指令
該指令對(duì)標(biāo)志位無影響。
假設(shè)加反復(fù)前綴REP,則能夠?qū)崿F(xiàn)連續(xù)存放的數(shù)據(jù)塊的傳送,直到(E)CX=0為止。
在16位指令模式下,使用SI,DI,CX寄存器;在32位指令模式下,使用ESI,EDI,ECX寄存器。
例 3.69
·MODEL SMALL
·DATA
SRC DB 1,2,3,…(100個(gè)字節(jié))
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
該程序?qū)⑵鹗嫉刂窞镾RC的100個(gè)字節(jié)內(nèi)容傳送到起始地址為DEST的存儲(chǔ)單元。
四、串比較指令
基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
[REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
功能:由DS:(E)SI規(guī)定的源串元素減去ES:(E)DI指出的目的串元素,結(jié)果不回送,僅影響標(biāo)志位CF,AF,PF,OF,ZF,SF。當(dāng)源 串元素與目的串元素值同樣時(shí),ZF=1;否則ZF=0。每運(yùn)行一次串比較指令,依據(jù)DF的值和串元素?cái)?shù)據(jù)類型自己主動(dòng)改動(dòng)(E)SI和(E)DI。
在串比較指令前加反復(fù)前綴REPE/Z,則表示反復(fù)比較兩個(gè)字符串,若兩個(gè)字符串的元素同樣則比較到(E)CX=0為止,否則結(jié)束比較。在串比較指令 前加反復(fù)前綴REPNE/NZ,則表示若兩個(gè)字符串元素不同樣時(shí),反復(fù)比較直到(E)CX=0為止,否則結(jié)束比較。
例 3.70 編程實(shí)現(xiàn)兩個(gè)串元素比較,如同樣則將全“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的內(nèi)容減去ES:(E)DI規(guī)定的目的串元素,結(jié)果不回送,僅影響標(biāo)志位CF,AF,PF,SF,OF,ZF。當(dāng)AL, AX或EAX的值與目的串元素值同樣時(shí),ZF=1;否則ZF=0。每運(yùn)行一次串掃描指令,依據(jù)DF的值和串元素?cái)?shù)據(jù)類型自己主動(dòng)改動(dòng)(E)DI。
在串掃描指令前加反復(fù)前綴REPE/Z,則表示目的串元素值和累加器值同樣時(shí)反復(fù)掃描,直到CX/ECX=0為止,否則結(jié)束掃描。若加反復(fù)前綴 REPNE/NZ,則表示當(dāng)目的串元素值與累加器值不相等時(shí),反復(fù)掃描直到CX/ECX=0時(shí)為止,否則結(jié)束掃描。
該指令影響標(biāo)志位為CF,AF,PF,SF,OF,ZF。
例 3.71 在內(nèi)存DEST開始的6個(gè)單元尋找字符‘C’,如找到將字符‘C’的地址送ADDR單元,否則0送ADDR單元。
·MODEL SMALL
·DATA
DEST DB ‘A B C D E F’
ADDR DW?;存“C”的地址,所以設(shè)置為字類型
·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值以及串元素類型自己主動(dòng)改動(dòng)地址指針SI/ESI,該指令一般不須加反復(fù)前綴,而且不影響標(biāo)志位。
七、 串存儲(chǔ)指令
格式:[REP] STOS DESTS
[REP] STOSB/STOSW/STOSD
功能:將累加器/[AL,AX,EAX/]中值存入ES:DI/EDI所指的目的串存儲(chǔ)單元中,每傳遞一次,都按DF值以及串元素類型自己主動(dòng)改動(dòng)地址指 針DI/EDI。若加反復(fù)前綴REP,則表示將累加器的值連續(xù)送目的串存儲(chǔ)單元,直到CX/ECX=0時(shí)為止。
該指令不影響標(biāo)志位。
3.3.6輸入/輸出指令
一、 輸入指令
格式:IN DEST, SRC
功能:依據(jù)源操作數(shù)SRC給出的port地址,將操作數(shù)從指定port傳送到目的操作數(shù)DEST處,當(dāng)中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
功能:將源操作數(shù)SRC送到目的操作數(shù)DEST所指定的port。當(dāng)中源操作數(shù)SRC為AL,AX或EAX,目的操作數(shù)能夠8位port地址方式直接給出或以DX寄存器間接方式給出。
使用輸入、輸出指令應(yīng)注意:
· 直接尋址方式port地址為8位,共同擁有0~255個(gè)port地址;
· 間接尋址方式,僅僅能用DX作為地址寄存器,尋址范圍為64K字節(jié);
· 每一個(gè)I/O地址相應(yīng)的port的數(shù)據(jù)長(zhǎng)度為8位,傳送8位數(shù)據(jù)占用一個(gè)port地址,傳送16位數(shù)據(jù)占用2個(gè)port地址,傳送32位數(shù)據(jù)占用4個(gè)port地址。
三、 串輸入指令
格式:[REP] INS DESTS, DX
[REP] INSB/INSW/INSD
功能:依據(jù)DX給出的port地址,從外設(shè)讀入數(shù)據(jù)送入以ES:DI/EDI為地址的目的串存儲(chǔ)單元中,每輸入一次,均依據(jù)DF的值和串元素類型自己主動(dòng)改動(dòng) DI/EDI的值。若加反復(fù)前綴REP,則表示連續(xù)從外設(shè)輸入串元素存入目的串存儲(chǔ)單元中,直到CX/ECX=0為止。
例 3.73 從port地址為1000H處取數(shù)存入內(nèi)存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地址送往外設(shè),每輸出一次,均依據(jù)DF的值和串元素類型自己主動(dòng)改動(dòng)SI/ESI的值,若加反復(fù)前綴REP,則表示連續(xù)向外設(shè)輸出串元素,直到CX/ECX=0時(shí)為止。
例 3.74 將內(nèi)存BLOCK為首地址的100個(gè)字符送往port地址為2000H的外設(shè)。
·MODEL SMALL
·DATA
BLOCKDB ‘A,B,…’(100個(gè)字符)
·CODE
·STARTUP
CLD
LEA SI,BLOCK
MOV CX,100
MOV DX,2000H
REP OUTSB
·EXIT
END
在使用帶反復(fù)前綴的串輸入輸出指令時(shí),必須考慮port的數(shù)據(jù)準(zhǔn)備或接收狀態(tài)。
全部輸入輸出指令均不影響標(biāo)志位。
3.3.7處理器控制
一、 總線封鎖前綴
格式:LOCK指令
功能:LOCK為指令前綴,能夠使LOCK引腳變成邏輯0,在LOCK引腳有效期間,禁止外部總線上的其他處理器存取帶有LOCK前綴指令的存儲(chǔ)器操作數(shù)。
可加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為存儲(chǔ)器操作數(shù),Reg為通用寄存器,imm為馬上數(shù)。
二、空操作
格式:NOP
功能:空操作,除使IP/EIP增1外,不做不論什么工作。該指令不影響標(biāo)志位。
三、處理器等待指令
格式:WAIT
功能:檢查BUSY引腳狀態(tài),等待協(xié)處理器完畢當(dāng)前工作。
四、處理器暫停指令
格式:HLT
功能:暫停程序的運(yùn)行。當(dāng)產(chǎn)生一個(gè)外部中斷或非屏蔽中斷時(shí),才繼續(xù)運(yùn)行下一條指令。
3.3.8中斷指令與DOS功能調(diào)用
一、中斷指令
在實(shí)模式下,中斷矢量以4個(gè)字節(jié)存放在中斷矢量表中,中斷矢量表為1k字節(jié)(00000H~003FFH),中斷矢量表同意存放256個(gè)中斷矢量,每 個(gè)中斷矢量包括一個(gè)中斷服務(wù)程序地址(段值和16位偏移地址),中斷矢量地址指針由中斷類型碼乘以4得到。
在保護(hù)模式下,用中斷描寫敘述符表取代中斷矢量表,每一個(gè)中斷由8個(gè)字節(jié)的中斷描寫敘述符來說明,中斷描寫敘述符表同意256個(gè)中斷描寫敘述符,每一個(gè)中斷描寫敘述符包括一個(gè)中斷服務(wù)地址(段選擇符、32位偏移地址、訪問權(quán)限等)。中斷描寫敘述符地址指針由中斷類型碼乘以8得到。
中斷指令格式:INT n
功能:產(chǎn)生中斷類型碼為n的軟中斷,該指令包括中斷操作碼和中斷類型碼兩部分,中斷類型碼n為8位,取值范圍為0~255(00H~FFH)。
軟中斷運(yùn)行過程:
· 將標(biāo)志寄存器FLAGS(或EFLAGS)壓入堆棧;
· 清除TF和IF標(biāo)志位;
· CS,IP/EIP壓入堆棧;
· 實(shí)模式下,n×4獲取中斷矢量表地址指針;保護(hù)模式下,n×8獲取中斷描寫敘述符表地址指針;
· 依據(jù)地址指針,從中斷矢量表或中斷描寫敘述符表中取出中斷服務(wù)程序地址送IP/EIP和CS中,控制程序轉(zhuǎn)移去運(yùn)行中斷服務(wù)程序。
中斷返回指令格式:IRET/IRETD
功能:該指令實(shí)如今中斷服務(wù)程序結(jié)束后,返回到主程序中斷斷點(diǎn)處,繼續(xù)運(yùn)行主程序。
中斷返回運(yùn)行過程:
· IRET指令彈出堆棧中數(shù)據(jù)送IP,CS,FLAGS;
· IRETD指令彈出堆棧中數(shù)據(jù)送EIP,CS,EFLAGS。
其他中斷類指令如表311所看到的。
表 3.11 中斷類指令
二、DOS功能調(diào)用
系統(tǒng)功能調(diào)用是MS—DOS為程序猿編寫匯編語言源程序提供的一組子程序,包含設(shè)備管理、文件管理和文件夾管理等。
DOS規(guī)定使用軟中斷指令I(lǐng)NT 21H作為進(jìn)入各功能子程序的總?cè)肟?#xff0c;再為每一個(gè)功能調(diào)用規(guī)定一個(gè)功能號(hào),引用功能號(hào)就可以進(jìn)入對(duì)應(yīng)的子程序入口。DOS系統(tǒng)功能調(diào)用的用法歸納例如以下:
(1) 傳送入口參數(shù)到指定的寄存器中;
(2) 把要調(diào)用功能的功能號(hào)送入AH寄存器中;
(3) 用INT 21H指令轉(zhuǎn)入子程序入口;
(4) 對(duì)應(yīng)的子程序運(yùn)行結(jié)束后,能夠依照規(guī)定取得出口參數(shù)。
經(jīng)常使用系統(tǒng)功能調(diào)用簡(jiǎn)單介紹。
1鍵盤輸入單字符
這是1號(hào)系統(tǒng)功能調(diào)用,其調(diào)用格式為
MOV AH,1
INT 21H
該功能調(diào)用無入口參數(shù)。其功能為系統(tǒng)等待鍵盤輸入,如是Ctrol-Break鍵則退出;否則將鍵入字符的ASCII碼送入AL寄存器中,而且通過顯示器顯示該字符。
2鍵盤輸入字符串
這是0AH號(hào)系統(tǒng)功能調(diào)用,其功能為將鍵盤輸入的字符串寫入內(nèi)存單元中。因此,首先在內(nèi)存中定義一個(gè)緩沖區(qū),緩沖區(qū)第一個(gè)字節(jié)存放規(guī)定字符串的最大字 節(jié)數(shù),第二個(gè)字節(jié)由系統(tǒng)送入實(shí)際鍵入的字符數(shù),從第三個(gè)字節(jié)開始用于存放鍵入的字符串,最后通過鍵入回車鍵來表示字符串的結(jié)束。假設(shè)實(shí)際鍵入的字符數(shù)未達(dá) 到最大規(guī)定數(shù),其緩沖區(qū)的空余區(qū)間填0;假設(shè)實(shí)際鍵入數(shù)超過緩沖區(qū)的容量,則超出的字符自己主動(dòng)丟失,而且響鈴警告。注意,回車鍵值也存于緩沖區(qū)中。
例 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為首地址的緩沖區(qū)定義了20個(gè)字符串字節(jié)的緩沖區(qū),而且將緩沖區(qū)首地址送入DX中,調(diào)用0AH號(hào)子程序,系統(tǒng)等待用戶鍵入字符串,每鍵 入一個(gè)字符,其對(duì)應(yīng)的ASCII碼將被寫入緩沖區(qū)中,直到鍵入回車鍵,由系統(tǒng)輸入實(shí)際鍵入字符數(shù),送入緩沖區(qū)第二個(gè)字節(jié)中。
3輸出單字符
這是2號(hào)系統(tǒng)功能調(diào)用,其使用格式為:
MOV DL,‘A’
MOV AH,2
INT 21H
運(yùn)行2號(hào)系統(tǒng)功能調(diào)用,將置入DL寄存器中的字符(以ASCII碼形式表示)通過顯示器顯示出來(或從打印機(jī)輸出)。
4輸出字符串
這是9號(hào)系統(tǒng)功能調(diào)用,其功能是將指定的內(nèi)存緩沖區(qū)中的字符串從顯示器顯示輸出(或從打印機(jī)輸出),緩沖區(qū)中的字符串以字符‘$’作為結(jié)束標(biāo)志。
例 3.76使用格式舉例。
·MODEL SMALL
·DATA
BUF DB ‘Thank you $’
·CODE
·STARTUP
MOV DX,OFFSET BUF
MOV AH,9
INT 21H
·EXIT
END
5返回操作系統(tǒng)
這是4CH號(hào)系統(tǒng)功能調(diào)用,使用格式為
MOV AH,4CH
INT 21H
在用戶程序結(jié)束處插入此調(diào)用,則返回到DOS操作系統(tǒng),顯示器顯示系統(tǒng)提示符。
習(xí)題與思考題
1數(shù)據(jù)尋址方式有哪幾種?
216位指令模式下和32位指令模式下的存儲(chǔ)器尋址方式各有哪幾種尋址方式?并比較它們類似與不同之處。
3程序地址尋址方式有哪幾種?
4什么是堆棧地址尋址方式?
5指令編碼格式是由哪幾部分組成的?各部分的含義是什么?
6 80x86的指令格式由哪幾部分組成?
7 80x86指令系統(tǒng)按其功能可分為幾部分?
8數(shù)據(jù)傳送指令包含哪些類型?
9堆棧的含義是什么?80x86所用的堆棧有什么特點(diǎn)?
10堆棧操作指令有哪幾種?
11 XLAT指令在使用時(shí)有哪些規(guī)定?
12符號(hào)擴(kuò)展指令在什么情況下使用?
13十進(jìn)制算術(shù)運(yùn)算調(diào)整指令在什么情況下使用?它們都是跟在哪些指令的后面?
14哪些指令採(cǎi)用隱含尋址?
15使用算術(shù)運(yùn)算類指令應(yīng)注意哪些問題?
16邏輯運(yùn)算指令有幾種?
17測(cè)試指令和比較指令在使用時(shí)有什么不同?
18算術(shù)移位指令和邏輯移位指令有什么不同?
19控制轉(zhuǎn)移類指令的作用是什么?有哪幾種?
20什么叫串?串操作指令有哪些?串前綴在什么情況下使用?
21輸入/輸出指令起什么作用?尋址方式有哪些?
22設(shè)DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX=00001000H,EBX= 00002000H,假設(shè)按16位實(shí)模式操作,確定下列每條指令訪問內(nèi)存的物理地址,而且指出源操作數(shù)及目的操作數(shù)的尋址方式。
(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試指出下列指令中的錯(cuò)誤。
(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指出下列算術(shù)邏輯指令運(yùn)行后標(biāo)志CF,ZF,SF,PF,OF和AF的狀態(tài)。
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的字節(jié)緩沖區(qū)中第5個(gè)字節(jié)數(shù)送AL寄存器的指令,要求使用下面幾種尋址方式:
(1) 寄存器間接尋址;
(2) 寄存器相對(duì)尋址;
(3) 基址變址尋址。
27試分別使用數(shù)據(jù)傳送指令、交換指令和堆棧操作指令,實(shí)現(xiàn)將首地址為BLOCK的內(nèi)存單元中兩個(gè)數(shù)據(jù)字交換。BLOCK變量定義例如以下:
BLOCK DW 10H,20H
28設(shè)一個(gè)字節(jié)數(shù)據(jù)X存放在AL寄存器中,試說明下列程序的功能。
XOR AH,AH
SAL AX,1
MOV BX,AX
MOV CL,2
SAL AX,CL
ADD AX,BX
29試編程實(shí)現(xiàn):
(1) AL寄存器的低4位清0;
(2) BL寄存器的低4位置1;
(3) CL寄存器的低4位取反;
(4) 測(cè)試DL寄存器的最低2位是否為0,若是將0送入AL寄存器;否則將1送AL寄存器。
30試編程統(tǒng)計(jì)在AX寄存器中有多少個(gè)1,并將結(jié)果送DL寄存器中。
31試編程統(tǒng)計(jì)在內(nèi)存BLOCK單元開始按字節(jié)存放的100個(gè)帶符號(hào)數(shù)中有多少負(fù)數(shù),并將結(jié)果存放在DL寄存器中。
總結(jié)
以上是生活随笔為你收集整理的x86汇编指令具体解释的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS8中提示框的使用UIAlertCo
- 下一篇: 华为防火墙的技术积累