彙編語言--微機CPU的指令系統(五)(算術運算指令)

(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在內存中以下所示。

clip_image002[4]

方法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的對應關係存放。

clip_image004[4]

(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。

clip_image006[4]

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

相關文章
相關標籤/搜索