3.3.1 算術(shù)運(yùn)算指令
8088可提供加、減、乘、除4種基本算術(shù)運(yùn)算的操作指令。這些指令可實(shí)現(xiàn)字節(jié)或字的運(yùn)算,也可以用于符號(hào)數(shù)和無符號(hào)數(shù)的運(yùn)算。
8088還提供各種校正操作,故可以進(jìn)行十進(jìn)制的算術(shù)運(yùn)算。進(jìn)行加、減運(yùn)算的源操作數(shù)和目的操作數(shù)的關(guān)系如圖3.15所示。
1.加法指令
(1)ADDOPRD1,OPRD2
這條指令完成兩個(gè)操作數(shù)相加,結(jié)果送至目的操作數(shù)OPRD1,即OPRD1←OPRD1+OPRD2目的操作數(shù)可以是累加器、任一通用寄存器或存貯器中的操作數(shù)。
具體地說,該指令可以實(shí)現(xiàn)累加器與立即數(shù)、累加器與任一通用寄存器、累加器與存貯單元內(nèi)容相加,其和放回累加器中,
例如:
ADD AL,30
ADD AX,3000H
ADD AX,SI
ADD AL,DATA

該指令也可以實(shí)現(xiàn)任一通用寄存器與立即數(shù)、累加器或別的寄存器、存貯單元的內(nèi)容相加,其和放回寄存器中,
例如:
ADD BX,3FFH
ADD SI,AX
ADD DI,CX
ADD DX,DATA[BX+SI]
該指令還可以實(shí)現(xiàn)存貯器操作數(shù)與立即數(shù)、累加器或別的寄存器的內(nèi)容相加,其和放回存貯單元中,
例如
ADD BETA[SI],100
ADD BETA[SI],AX
ADD BETA[SI],DX
這些指令執(zhí)行時(shí),對標(biāo)志位CF、OF、PF、SF、ZF和AF都會(huì)產(chǎn)生影響。
(2) ADC指令
這條指令與ADD指令基本相同,只是在對兩個(gè)操作數(shù)進(jìn)行相加運(yùn)算時(shí)還應(yīng)加上進(jìn)位位的當(dāng)前值,然后再將結(jié)果送至目的操作數(shù)。
例如,兩個(gè)四字節(jié)數(shù)已分別放在首地址為FIRST和SECOND的內(nèi)存區(qū)中。每個(gè)數(shù)占4個(gè)存貯單元,存放時(shí)低字節(jié)在前,高字節(jié)在后。那么用如下ADD
和ADC指令就可實(shí)現(xiàn)四字節(jié)數(shù)的相加,相加結(jié)果放入THIRD為首地址的單元中。
MOV AX, FIRST
ADD AX, SECOND
MOV THIRD,AX
MOV AX, FIRST+2
ADC AX,SECOND+2
MOV THIRD+2,AX
該指令對標(biāo)志位的影響與ADD指令對標(biāo)志位的影響相同。
(3) INCOPRD指令
這條指令對指定的操作數(shù)進(jìn)行加1操作,在循環(huán)程序中常用于修改地址指針和循環(huán)次數(shù)等。其操作數(shù)可以在通用寄存器中,也可以在內(nèi)存單元中。
該指令執(zhí)行結(jié)果對標(biāo)志位AF、OF、PF、SF和ZF有影響,而對CF位不產(chǎn)生影響.
例如:
INC AL
INC[SI] ;
2. 減法指令
(1)SUBOPRD1,OPRD2
該指令進(jìn)行兩個(gè)操作數(shù)的相減,即從OPRD1中減去OPRD2,其結(jié)果放于OPRD1中。具體地說,可以從累加器中減去立即數(shù);
或從寄存器和內(nèi)存操作數(shù)中減去立即數(shù);或從寄存器操作數(shù)減去寄存器或內(nèi)存操作數(shù);或從寄存器或內(nèi)存操作數(shù)減去寄存器操作數(shù)等,
其類型完全與ADD指令的相同,
例如:
SUB CX,BX
SUB [BP+2],CL
(2) SBB指令
該指令與SUB相類似,只不過在兩個(gè)操作數(shù)相減時(shí),還應(yīng)減去借位標(biāo)志CF的當(dāng)前值。與ADC一樣,這條指令主要用于多字節(jié)的減法運(yùn)算,在前面的四字節(jié)
加法運(yùn)算的例子中,若用SUB代替ADD,用SBB代替ADC,那么就可以實(shí)現(xiàn)兩個(gè)四字節(jié)的減法運(yùn)算。該指令對標(biāo)志位AF、CF、OF、PF、SF和ZF都將產(chǎn)生影響。
(3) DECOPRD指令
該指令實(shí)現(xiàn)對操作數(shù)的減1操作,所用的操作數(shù)可以是寄存器的,也可以是內(nèi)存的。
在相減時(shí),把操作數(shù)看作為無符號(hào)的二進(jìn)制數(shù)。該指令執(zhí)行結(jié)果將影響標(biāo)志位AF、OF、PF、SF和ZF,但對CF標(biāo)志不產(chǎn)生影響,
例如:
DEC BX
DEC [DI]
(4) NEG OPRD
該指令用來對操作數(shù)進(jìn)行求補(bǔ)操作,即用零減去操作數(shù),然后再將結(jié)果送回,
例如:
NEG AL
NEG MULRE
該指令對字節(jié)操作時(shí),對-128求補(bǔ);對字操作時(shí),對-32768求補(bǔ),則操作數(shù)不變,但是此時(shí)溢出標(biāo)志OF將置位。
(5) CMPOPRD1,OPRD2
該指令為比較指令,完成OPRD1-OPRD2的操作,這一點(diǎn)與減法指令相同,而且相減結(jié)果也同樣反映在標(biāo)志位上。但是與減法指令SUB的主要不同點(diǎn)是相減后
不回送結(jié)果,即執(zhí)行比較指令以后,兩個(gè)操作數(shù)的內(nèi)容是不變化的。
比較指令可以用于累加器與立即數(shù),累加器與任一通用寄存器或任一內(nèi)存操作數(shù)之間的比較。
例如:
CMP AL,100
CMPAX,SI
CMPAX,DATA[BX]
該指令也可以用于任一寄存器與立即數(shù)或別的寄存器及任一內(nèi)存操作數(shù)之間的比較,
例如:
CMP BX,04FEH
CMP DX,DI
CMP CX,COUNT[BP]
該指令還可以用于內(nèi)存操作數(shù)與立即數(shù)及任一寄存器中操作數(shù)之間的比較,
例如:
CMP DATA,100
CMP COUNT[SI],AX
CMP POINTER[DI],BX
綜上所述,可以歸納出如下結(jié)論:
當(dāng)沒有溢出時(shí)(OF=0),若SF=0,則AX≥BX;若SF=1,則AX<BX。
當(dāng)產(chǎn)生溢出時(shí)(OF=1),若SF=0,則AX<BX;若SF=1,則AX≥BX。
用邏輯表達(dá)式又可簡化為:
若OFSF=0,則AX≥BX; ;
若OFSF=1,則AX<BX。
例如,若自BLOCK開始的內(nèi)存緩沖區(qū)中,有100個(gè)帶符號(hào)的數(shù),希望找到其中最大的一個(gè)值,并將它放到MAX單元中。
編制該程序的思路是這樣的:先把數(shù)據(jù)塊中的第一個(gè)數(shù)取到AX中,然后從第二個(gè)存貯單元開始,依次與AX中的內(nèi)容進(jìn)行比較。若AX中的值大,則接著比較;
若AX中的值小,則把內(nèi)存單元中的內(nèi)容送到AX中。這樣經(jīng)過99次比較,在AX中必然存放著數(shù)據(jù)塊中最大的一個(gè)數(shù),然后利用傳送指令將它放到MAX單元中去。
這是一個(gè)循環(huán)程序。循環(huán)程序開始應(yīng)置初值,包括循環(huán)次數(shù)為99次。在循環(huán)體中應(yīng)包括比較指令和轉(zhuǎn)移控制指令。
滿足上述功能要求的程序是:
MOV BX,OFFSET BLOCK
MOV AX,
INC BX
INC BX
MOV CX,99
AGAIN: CMP AX,[BX]
JG NEXT
MOV AX,[BX]
NEXT:INC BX
INC BX
DEC CX
JNE AGAIN
MOV MAX,AX
HLT
8088除了上述的算術(shù)運(yùn)算指令以外,還有幾條功能很強(qiáng)的乘、除法指令和校正指令。
3. 乘法指令
(1)無符號(hào)數(shù)乘法指令MUL
該指令的一般格式為MUL OPRD ;OPRD為源操作數(shù)
例:字節(jié)乘以字節(jié):
MOVAL,LSRC --BYTE;被乘數(shù)送AL
MULRSRC --BYTE;結(jié)果存于AX中
字乘以字
MOV AX,LSRC –WORD ;一個(gè)字送AX
MUL RSRC –WORD ;結(jié)果的高字節(jié)在DX中;低字節(jié)在AX中
字節(jié)乘以字:
MOVAL,MUL –BYTE ;字節(jié)被乘數(shù)送AL
CBW ;AL中字節(jié)轉(zhuǎn)換成AX中的字
MULRSRC --WORD ;
(2) 帶符號(hào)數(shù)乘法指令I(lǐng)MUL
該指令的一般格式為IMULOPRD
例:字節(jié)乘以字節(jié):
MOV AL,LSRC –BYTE ;被乘數(shù)送AL
IMUL RSRC --BYTE ;4. 除法指令
8088有兩條除法指令:無符號(hào)除法指令和帶符號(hào)除法指令。
(1)無符號(hào)數(shù)除法指令DIV
執(zhí)行該指令,如果結(jié)果大于寄存器可以保存的值時(shí),則產(chǎn)生0型中斷。
例:字除以字節(jié):
MOV AX,NUMERATOR –WORD ;被除數(shù)送AX
DIV DIVISOR –BYTE ;商在AL中,余數(shù)在AH中
字節(jié)除以字節(jié):
MOVAL,NUMERATOR –BYTE ;被除數(shù)送AL
CBW ;AL中的字節(jié)擴(kuò)展成AX中的字
DIV DIVISOR --BYTE
字除以字:
MOV AX,NUMERATOR --WORD
CWD ;把字轉(zhuǎn)換成雙字DX、AX
DIVDIVISOR –WORD ;商在AX中,余數(shù)在DX中
(2) 帶符號(hào)除法指令I(lǐng)DIV
該指令是帶符號(hào)的除法指令。除后,余數(shù)符號(hào)與被除數(shù)相同,其它同DIV指令。該指令一般格式為IDIVOPRD
例:雙倍字長除以字:
MOVDX,NUM --HI –WORD ;被除數(shù)高位字送DX
MOVAX,NUM --LO –WORD ;被除數(shù)低位字送AX
IDIVDIVISOR --WORD[SI]
5.校正指令
8088的調(diào)整指令主要用于十進(jìn)制數(shù)的調(diào)整。
AAA——對AL中ASCII未壓縮的十進(jìn)制和進(jìn)行調(diào)整;
AAS——對AL中ASCII未壓縮的十進(jìn)制差進(jìn)行調(diào)整;
AAD——在除法指令前對AX中ASCII未壓縮的十進(jìn)制數(shù)進(jìn)行調(diào)整;
AAM——對AX中兩個(gè)ASCII未壓縮十進(jìn)制相乘結(jié)果進(jìn)行調(diào)整;
DAA——對AL中的兩個(gè)壓縮十進(jìn)制數(shù)相加之和進(jìn)行調(diào)整,得到壓縮十進(jìn)制和;
DAS——對AL中的兩個(gè)壓縮十進(jìn)制數(shù)相減之差進(jìn)行調(diào)整,得到壓縮十進(jìn)制差
