汇编算术运算指令
匯編算術(shù)運算指令
????? 8086的算術(shù)運算類指令能夠?qū)ΧM制或十進制(BCD碼)數(shù)進行加、減、乘、除運算,操作數(shù)的數(shù)據(jù)形式可以是8位或16位的無符號數(shù)或帶符號數(shù)。對于單操作數(shù)指令,不允許使用立即數(shù)形式;對于雙操作數(shù)指令,只有源操作可以使用立即數(shù),兩個操作數(shù)中必須有一個在寄存器中。
1. 加法指令
指令格式: 加法 ADD DST, SRC; (DST)←(SRC)+(DST)
?????????????? 帶進位加法 ADC DST, SRC; (DST)←(SRC)+(DST)+CF
??????????????? 加1 INC OPR; (OPR)←(OPR)+1????
????? 注意:
??? 這三條指令運算結(jié)果將影響狀態(tài)標志位,但是INC指令不影響標志CF。下面以8位數(shù)加法運算為例作簡要說明。
????? [例4.20]
?
因為運算結(jié)果沒有超出單字節(jié)無符號數(shù)范圍,所以CF=0;運算結(jié)果超出單字節(jié)有符號數(shù)范圍,所以O(shè)F=1;其他標志 ZF=0,SF=1。 以上運算可以用兩條指令實現(xiàn): MOV AH,01 ADD AH,7FH
????? ADC指令主要用于多字節(jié)或多精度數(shù)據(jù)相加的運算。
??? 例如進行二組四字節(jié)(雙精度)數(shù)1122 3344H和5566 7788H的相加運算時,使用單字節(jié)加法指令需要執(zhí)行4次加法運算,運算過程中,通過ADC指令將低字節(jié)運算產(chǎn)生的進位加到高位字節(jié),而使用字加法指令,只需要執(zhí)行兩次加法運算,當然也必須通過ADC指令處理低字運算產(chǎn)生的進位。使用ADC指令,必須先將CF標志置0。
2. 減法指令
?
????? 指令格式:
????? 減法????????????? SUB?? DST,SRC ; (DST)←(DST)-(SRC)
????? 帶進位減法??????? SBB?? DST,SRC ; (DST)←(DST)-(SRC)-CF
????? 減1?????????????? DEC? OPR ;?????? (OPR)←(OPR)-1
????? 求補????????????? NEG OPR ;??????? (OPR)←0FFFFH-(0PR)+1
????? 比較????????????? CMP? OPR1, OPR2 ;?????? (OPR1)-(OPR2)
???
?????? SBB指令主要用于多字節(jié)或多精度數(shù)據(jù)相減的運算;NEG指令對操作數(shù)進行取反加1的操作;CMP指令類似SUB指令執(zhí)行減法操作,但不產(chǎn)生運算結(jié)果,對標志位影響見表4.3。 這幾條指令的運算結(jié)果都影響狀態(tài)標志位,只是DEC指令不影響標志CF。
????? [例4.22]
???? 直接相減算式結(jié)果為: (4006AH)=520FH,SF=0,ZF=0,CF=0,OF=0
??? 補碼加法算式結(jié)果為: (4006AH)=520FH,SF=0,ZF=0,CF=1,OF=0
算式中FECAH是(-0136H)的補碼。
??? 可見,兩種算式中運算結(jié)果是相同的,但是對標志CF的影響不同,因為是減法運算,正確結(jié)果應(yīng)是CF=0。用補碼加法得到運算結(jié)果CF=1,應(yīng)求反后送入CF。
????? 表4-3 CMP指令對狀態(tài)標志位的影響
3. 乘法指令
??? 乘法運算分為無符號數(shù)運算和有符號數(shù)運算,各有相應(yīng)的指令,并使用雙操作數(shù)。兩個8位二進制數(shù)相乘,積為16位二進制數(shù);兩個16位二進制數(shù)相乘,積為32位二進制數(shù)。
指令格式:
??? 無符號數(shù)乘法? MUL?? SRC;(AX)←(AL)×(SRC)8位數(shù)乘法
???????????????????????????? (DX,AX)←(AX)×(SRC)16位數(shù)乘法
??? 帶符號數(shù)乘法? IMUL? SRC; 操作同上,但是操作數(shù)為帶符號數(shù)
??? 注意:
??? 進行字節(jié)運算時,目的操作數(shù)必須是累加器AL,乘積在寄存器AX中;進行字運算時,目的操作數(shù)必須是累加器AX,乘積在寄存器DX、AX中。源操作數(shù)不允許使用立即數(shù)尋址方式。
??? 乘法指令運算結(jié)果只影響狀態(tài)標志CF、OF,對其他狀態(tài)標志位無影響(狀態(tài)不定)。
??? 對于 MUL 指令,如果字節(jié)型數(shù)據(jù)相乘之積(AH)=0或字數(shù)據(jù)相乘之積(DX)=0,則CF=OF=0,否則CF=OF=1;對于IMUL指令,如果字節(jié)數(shù)據(jù)相乘之積AH或字數(shù)據(jù)相乘之積DX的內(nèi)容是低一半的符號擴展,則CF=OF=0,否則CF=OF=1。
4. 除法指令
??? 除法運算分為無符號數(shù)運算和有符號數(shù)運算,各有相應(yīng)的指令,并使用雙操作數(shù)。當除數(shù)是8位或16位二進制數(shù)時,要求被除數(shù)是16位或32位的二進制數(shù)。
指令格式:
??? 無符號數(shù)除法? DIV? SRC;(AL)←(AX)/(SRC)8位二進制數(shù)除法的商
??????????????????????????? (AH)←(AX)/(SRC)8位二進制數(shù)除法的余數(shù)
????????????????????????? 或(AX)←(DX,AX)/(SRC) 16位二進制數(shù)除法的商
??????????????????????????? (DX)←(DX,AX)/(SRC) 16位二進制數(shù)除法的余數(shù)
??? 帶符號數(shù)除法 IDIV? SRC; 操作同上,但是操作數(shù)為帶符號數(shù)
???? 注意:
???? 當除數(shù)是字節(jié)數(shù)據(jù)時,被除數(shù)必須放在AX中,當除數(shù)是字數(shù)據(jù)時,被除數(shù)必須放在DX,AX中。
???? 除法指令運算結(jié)果對狀態(tài)標志無定義(狀態(tài)不定)。但是,若除數(shù)為0或帶符號數(shù),則當除法運算結(jié)果超出規(guī)定的范圍時,將產(chǎn)生0號中斷,與溢出標志OF無關(guān)。
???? 8086/8088 規(guī)定 IDIV 指令運算結(jié)果余數(shù)的符號與被除數(shù)相同。
???? 帶符號數(shù)除法運算中,當被除數(shù)位數(shù)不夠時,則需將被除數(shù)擴展到所需的位數(shù)。8086/8088設(shè)有帶符號數(shù)擴展指令。
指令格式:
???????? 字節(jié)擴展到字CBW;將寄存器AL中的符號位擴展到寄存器AH
???????? 字擴展到雙字CWD;將寄存器AX中的符號位擴展到寄存器DX
? 這兩條指令不影響標志位。
5. 十進制調(diào)整指令
??? BCD碼是一種用二進制編碼的十進制數(shù),又稱為二—十進制數(shù)。8086/8088中BCD碼分為兩種形式: 其一是用四位二進制數(shù)表示一位十進制數(shù),稱為壓縮的BCD碼;其二是用八位二進制數(shù)表示一位十進制數(shù),稱為非壓縮的BCD碼,它的低四位是BCD碼,高四位沒有意義。由于BCD碼是四位二進制編碼,四位二進制數(shù)共有16個編碼,BCD碼只用其中的10個,其余沒用的編碼稱為無效碼。BCD碼運算結(jié)果進入或跳過無效碼區(qū)時,都會出現(xiàn)錯誤。為了得到正確結(jié)果,必須進行調(diào)整。8086/8088針對壓縮BCD碼和非壓縮BCD碼,分別設(shè)有兩組十進制調(diào)整指令,其調(diào)整方法略有不同。
??? (1) 壓縮BCD碼十進制調(diào)整指令
指令格式:
加法十進制調(diào)整DAA;(AL)←把AL中的和調(diào)整到壓縮BCD碼格式
減法十進制調(diào)整DAS;(AL)←把AL中的差調(diào)整到壓縮BCD碼格式
??
調(diào)整方法是:
??? 累加器AL低4位大于9或輔助進位標志位AF=1,則累加器AL加06H修正。累加器AL高4位大于9或進位標志位CY=1,則累加器AL加60H修正。累加器AL高4位大于等于9,低4位大于9,則累加器AL進行加66H修正。
??? [例4.26]進行BCD碼加法運算59+68=127
?
??? 此例中,BCD碼加法結(jié)果的低四位使AF=1,高四位大于9,所以加66H進行修正。
??? 注意:
??? 壓縮BCD碼加法或減法十進制調(diào)整指令必須用在ADD(ADC)或SUB(SBB)指令之后,調(diào)整結(jié)果對標志OF無影響,對其他狀態(tài)標志位均有影響。
??? 減法十進制調(diào)整方法與加法十進制調(diào)整類同,只是將加6變?yōu)闇p6操作。
轉(zhuǎn)載于:https://www.cnblogs.com/hmmcsdd/archive/2008/05/01/huibiansuanshuzhiling.html
總結(jié)
- 上一篇: “皎如川上鹄”下一句是什么
- 下一篇: 选择模块数据读取