(3)算術運算指令程序員
算術運算指令是反映CPU計算能力的一組指令,也是編程時常常使用的一組指令。它包括:加、減、乘、除及其相關的輔助指令。編程
該組指令的操做數能夠是8位、16位和32位(80386+)。當存儲單元是該類指令的操做數時,該操做數的尋址方式能夠是任意一種存儲單元尋址方式。ide
1、加法指令 blog
(a)加法指令ADD(ADD Binary Numbers Instruction)ip
指令的格式:ADD Reg/Mem, Reg/Mem/Imm內存
受影響的標誌位:AF、CF、OF、PF、SF和ZFrem
指令的功能是把源操做數的值加到目的操做數中。get
(b)帶進位加指令ADC(ADD With Carry Instruction)it
指令的格式:ADC Reg/Mem, Reg/Mem/Immio
受影響的標誌位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操做數和進位標誌位CF的值(0/1)一塊兒加到目的操做數中。
(c)加1指令INC(Increment by 1 Instruction)
指令的格式:INC Reg/Mem
受影響的標誌位:AF、OF、PF、SF和ZF,不影響CF
指令的功能是把操做數的值加1。
(d)交換加指令XADD(Exchange and Add)
指令的格式:XADD Reg/Mem, Reg ;80486+
受影響的標誌位:AF、CF、OF、PF、SF和ZF
指令的功能是先交換兩個操做數的值,再進行算術「加」法操做。
例5.3 已知有二個32位數d1和d2(用數據類型DD說明),編寫程序片斷把d2的值加到d1中。
解:32位數d1和d2在內存中以下所示。
方法1:用16位寄存器編寫程序
MOV AX, word ptr d1 ;因爲d1是雙字類型,必須使用強制類型說明符。如下同。
MOV DX, word ptr d1+2 ;(DX,AX)構成一個32位數據
ADD AX, word ptr d2 ;低字相加
ADC DX, word ptr d2+2 ;高字相加。在低字相加時,有可能會產生「進位」
MOV word ptr d1, AX ;低字送給d1的低字
MOV word ptr d1+2, DX ;高字送給d1的高字
方法2:用32位寄存器編寫程序
MOV EAX, d1
ADD EAX, d2
MOV d1, EAX
從上面兩段程序不難看出:用32位寄存器來處理32位數據顯得簡單、明瞭,而16位微機雖然也能處理32位數據,但作起來就要複雜一些。
2、減法指令
(a)減法指令SUB(Subtract Binary Values Instruction)
指令的格式:SUB Reg/Mem, Reg/Mem/Imm
受影響的標誌位:AF、CF、OF、PF、SF和ZF
指令的功能是從目的操做數中減去源操做數。(前面減去後面)
(b)帶借位減SBB(Subtract with Borrow Instruction)
指令的格式:SBB Reg/Mem, Reg/Mem/Imm
受影響的標誌位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操做數和標誌位CF的值從目的操做數中一塊兒減去。
(c)減1指令DEC(Decrement by 1 Instruction)
指令的格式:DEC Reg/Mem
受影響的標誌位:AF、OF、PF、SF和ZF,不影響CF
指令的功能是把操做數的值減去1。
(d)求補指令NEG(Negate Instruction)
指令的格式:NEG Reg/Mem
受影響的標誌位:AF、CF、OF、PF、SF和ZF
指令的功能:操做數=0-操做數,即改變操做數的正負號。
例5.4 已知有二個32位數d1和d2,編寫程序片斷從d1中減去d2的值。
解:
方法1:用16位寄存器編寫程序
MOV AX, word ptr d1 ;取低字
MOV DX, word ptr d1+2 ;取高字,(DX,AX)構成一個32位數據
SUB AX, word ptr d2 ;低字相減
SBB DX, word ptr d2+2 ;高字相減。在低字相減時,有可能會產生「借位」
MOV word ptr d1, AX ;低字送給d1的低字
MOV word ptr d1+2, DX ;高字送給d1的高字
方法2:用32位寄存器編寫程序
MOV EAX, d1
SUB EAX, d2
MOV d1, EAX
3、乘法指令
計算機的乘法指令分爲無符號乘法指令和有符號乘法指令,它們的惟一區別就在於:數據的最高位是做爲「數值」參與運算,仍是做爲「符號位」參與運算。
乘法指令的被乘數都是隱含操做數,乘數在指令中顯式地寫出來。CPU會根據乘數是8位、16位,仍是32位操做數,來自動選用被乘數:AL、AX或EAX。
指令的功能是把顯式操做數和隱含操做數相乘,並把乘積存入相應的寄存器中。
(a) 無符號數乘法指令MUL(Unsigned Multiply Instruction)
指令的格式:MUL Reg/Mem
受影響的標誌位:CF和OF(AF、PF、SF和ZF無定義)
指令的功能是把顯式操做數和隱含操做數(都做爲無符號數)相乘,所得的乘積按表5.2的對應關係存放。
(b) 有符號數乘法指令IMUL(Signed Integer Multiply Instruction)
指令的格式: IMUL Reg/Mem
IMUL Reg, Imm ;80286+
IMUL Reg, Reg, Imm ;80286+
IMUL Reg, Reg/Mem ;80386+
受影響的標誌位:CF和OF(AF、PF、SF和ZF無定義)
1)指令格式1——該指令的功能是把顯式操做數和隱含操做數相乘,所得的乘積按表5.2的對應關係存放。
2)指令格式2——其寄存器必須是16位/32位通用寄存器,其計算方式爲:
Reg ← Reg × Imm
3)指令格式3——其寄存器只能是16位通用寄存器,其計算方式爲:
Reg1 ← Reg2×Imm 或 Reg1 ← Mem×Imm
4)指令格式4——其寄存器必須是16位/32位通用寄存器,其計算方式爲:
Reg1 ← Reg1×Reg2 或 Reg1 ← Reg1×Mem
在指令格式2~4中,各操做數的位數要一致。若是乘積超過目標寄存器所能存儲的範圍,則系統將置溢出標誌OF爲1。
4、除法指令
除法指令的被除數是隱含操做數,除數在指令中顯式地寫出來。CPU會根據除數是8位、16位,仍是32位,來自動選用被除數AX、DX-AX,仍是EDX-EAX。
除法指令功能是用顯式操做數去除隱含操做數,可獲得商和餘數。當除數爲0,或商超出數據類型所能表示的範圍時,系統會自動產生0號中斷。
(a) 無符號數除法指令DIV(Unsigned Divide Instruction)
指令的格式:DIV Reg/Mem
指令的功能是用顯式操做數去除隱含操做數(都做爲無符號數),所得商和餘數按表5.3的對應關係存放。指令對標誌位的影響無定義。
(b) 有符號數除法指令IDIV(Signed Integer Divide Instruction)
指令的格式:IDIV Reg/Mem
受影響的標誌位:AF、CF、OF、PF、SF和ZF
指令的功能是用顯式操做數去除隱含操做數(都做爲有符號數),所得商和餘數的對應關係見表5.3。
5、類型轉換指令
在做有符號除法時,有時須要把短位數的被除數轉換成位數更長的數據類型。好比,要用BL中的數據去除AL,但根據除法指令的規定:除數是8位,則被除數必須是AX,因而就涉及到AH的取值問題。
爲了方便說明,假設:(AH)=1H,(AL)=90H=-112D,(BL)=10H。
1)、在做除法運算前,必須處理AH的原有內容
假設在做除法時,無論AH中的值,這時,(AH、AL)/BL的商是19H,但咱們知道:AL/BL的商應是-7,這就致使:計算結果不是所預期的結果,因此,在做除法運算前,程序員必需要處理AH中的值。
2)、做無符號數除法時
可強置AH的值爲0,因而,可獲得正確的結果。
3)、做有符號數除法時
若是強置AH爲0,則AX=0090H,這時,AX/BL的商爲9,顯然結果也不正確。
若是把AL的符號位1,擴展到AH中,得:AX=0FF90H=-112D,這時,AX/BL的商就是咱們所要的正確結果。
綜上所述,由於在進行有符號數除法時存在隱含操做數數據類型轉換的問題,因此,系統提供了四條數據類型轉換指令:CBW、CWD、CWDE和CDQ。
(a)字節轉換爲字指令CBW(Convent Byte to Word)
指令的格式:CBW
該指令的隱含操做數爲AH和AL。其功能是用AL的符號位去填充AH,即:當AL爲正數,則AH=0,不然,AH=0FFH。
指令的執行不影響任何標誌位。
(b)字轉換爲雙字指令CWD(Convent Word to Doubleword)
指令的格式:CWD
該指令的隱含操做數爲DX和AX,其功能是用AX的符號位去填充DX。指令的執行不影響任何標誌位。
(c)字轉換爲擴展的雙字指令CWDE(Convent Word to Extended Doubleword)
指令的格式:CWDE ;80386+
該指令的隱含操做數爲DX和AX,其功能是用AX的符號位填充EAX的高字位。指令的執行不影響任何標誌位。
(d)雙字轉換爲四字指令CDQ(Convent Doubleword to Quadword)
指令的格式:CDQ ;80386+
該指令的隱含操做數爲EDX和EAX,指令的功能是用EAX的符號位填充EDX。指令的執行不影響任何標誌位。
例5.5 編寫程序段,完成下面計算公式,並把所得的商和餘數分別存入X和Y中(其中:A,B,C,X和Y都是有符號的字變量)。
(C - 120 + A*B) / C
解:
…
A DW ?
B DW ?
C DW ?
X DW ?
Y DW ?
…
MOV AX, C
SUB AX, 120D ;書寫指令「ADD AX, -120D」也能夠
CWD
MOV CX, DX
MOV BX, AX ;(CX, BX)←(DX, AX),調度寄存器,爲做乘法準備必要的寄存器
MOV AX, A
IMUL B ;(DX, AX)←A*B
ADD AX, BX ;計算32位二進制之和,爲做除法做準備
ADC DX, CX
IDIV C ;AX是商,DX是餘數
MOV X, AX ;分別保存商和餘數到指定的字變量單元裏
MOV Y, DX
…