算術運算指令
80x86指令包括加、減、乘、除四種基本算術運算操作及十進制算術運算調整指令。二進制加、減法指令,帶符號操作數
採用補碼錶示時,無符號數和帶符號數據運算可以使用相同的指令。二進制乘、除法指令分帶符號數和無符號數運算指令
• 加法指令、減法指令、加1減1指令
• 比較指令、交換相加指令、求補指令
• 乘法指令、除法指令
一、加法指令
格式:ADD DEST,SRC
ADC DEST,SRC
功能:ADD是將源操作數與目的操作數相加,結果傳送到目的操作數。ADC是將源操作數與目的操作數以及CF(低位進位)值相加,結果傳送到目的 如果CF=0 就相當於ADD
操作數。
源操作數可以是通用寄存器、存儲器或立即數。目的操作數可以是通用寄存器或存儲器操作數。
ADD,ADC指令影響標誌位為OF,SF,ZF,AF,PF,CF。
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將目的操作數減源操作數,結果送目的操作數。SBB將目的操作數減源操作數,還要減CF(低位借位)值,結果送目的操作數。
源操作數可以是通用寄存器、存儲器或立即數。目的操作數可以是通用寄存器或存儲器操作數。
SUB,SBB指令影響標誌位為OF,SF,ZF,AF,PF,CF
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 DESTDEC DEST
功能:INC指令將目的操作數加1,結果送目的操作數。DEC指令將目的操作數減1,結果送目的操作數。目的操作數為通用寄存器或存儲器操作數。INC,DEC指令影響標誌位為OF,SF,ZF,AF,
INC BL;BL←BL+1
INC AX;AX←AX+1
INC WORDPTR [BX];存儲器操作數加1
DEC BYTE PTR [SI];存儲器操作數減1
DEC EAX;EAX←EAX-1
四、比較指令
格式:CMP DEST,SRC
功能:目的操作數減源操作數,結果不回送。源操作數為通用寄存器、存儲器和立即數。目的操作數為通用寄存器、存儲器操作數。CMP指令影響標誌位為OF,SF,ZF,AF,PF,CF
CMP CX,3
CMP WORD PTR [SI],3
CMP AX,BLOCK
四、比較指令-CMP指令對標誌位的影響
執行比較指令後,對狀態標誌位影響見表。
對於兩個數的比較(AX-BX)有以下3種情況兩個正數比較,使用SF標誌位判斷。
SF=0,則AX≥BX,若ZF=1,則AX=BX SF=1則AX<BX
兩個無符號數比較,使用CF標誌位判斷。
CF=0,則AX≥BX,若ZF=1,則AX=BX
CF=1,則AX<BX
兩個負數比較,使用SF標誌位判斷。
SF=0,則AX≥BX,若ZF=1,則AX=BX
SF=1,則AX<BX
兩個異符號數比較。
如果OF=0,仍可用SF標誌判斷大小。
如果OF=1,説明結果的符號位發生錯誤,所以
SF=0,則AX<BX
SF=1,則AX>BX
綜上所述:兩個異號數比較
當OF=0,SF=0,則AX>BX
SF=1,則AX<BX
當OF=1,SF=0,則AX<BX
SF=1,則AX>BX
用邏輯表達式表示為:
若OF∨-SF=0,則AX>BX
若OF∨-SF=1,則AX<BX
五、交換相加指令
格式:XADD DEST,REG
功能:目的操作數加源操作數,結果送目的操作數。原目的操作數內容送源操作數。源操作數允許為通用寄存器。目的操作數允許為通用寄存器、
存儲器操作數。
XADD指令影響標誌位為OF,SF,ZF,AF,PF,CF。
六、求補指令
NEG DEST
功能:對目的操作數求補,用零減去目的操作數,結果送目的操作數。目的操作數為通用寄存器、存儲器操作數。
NEG指令影響標誌位為OF,SF,ZF,AF,PF,CF
七、乘法指令
格式:MUL SRC
IMUL SRC
功能:MUL為無符號數乘法指令,IMUL為帶符號數乘法指令。源操作數為通用寄存器或存儲器操作數。目的操作數缺省存放在ACC(AL,AX,EAX)
中,乘積存AX,DX:AX,EDX:EAX中。
字節乘:AL SRC→AX
字乘:AX SRC→DX∶AX
雙字乘:EAX SRC→EDX∶EAX
MUL,IMUL指令執行後,CF=OF=0,表示乘積高位無有效數據;CF=OF=1表示乘積高位含有效數據,對其它標誌位無定義。
七、乘法指令
MUL BL;字節乘
MUL WORD PTR [SI];字乘
IMUL BYTE PTR [DI];字節乘
IMUL DWORD PTR [ECX];雙字乘
如果使用IMUL指令,積採用補碼形式表示。
八、除法指令
格式:DIV SRC
IDIV SRC
功能:DIV為無符號數除法,IDIV為帶符號數除法。源操作數作為除數,為通用寄存器或存儲器操作數。被除數缺省在目的操作數AX,
DX:AX,EDX:EAX中。
字節除法:AX/SRC商→AL,餘數→AH
字除法:DX·AX/SRC商→AX,餘數→DX
雙字除法:EDX·EAX/SRC商→EAX,餘數→EDX
由於被除數必須是除數的雙倍字長,一般應使用擴展指令進行高位擴展。當進行無符號數除法時,被除數高位按0擴展為雙倍除數字長。當進
行有符號數除法時,被除數以補碼錶示。可使用擴展指令CBW,CWD,CWDE,CDQ進行高位擴展。
例如:
MOV AX,BLOCK
CWD;被除數高位擴展
MOV BX,1000H
IDIV BX
對於帶符號除法,其商和餘數均採用補碼形式表示,餘數與被除數同符號。當除數為零或商超過了規定數據類型所能表示的範圍時,將會出現
溢出現象,產生一箇中斷類型碼為“0”的中斷。執行除法指令後標誌位無定義