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