168.算術指令

1 算術指令

 加法指令
ADD、ADC、INC
 減法指令
SUB、SBB、DEC、NEG、CMP
 乘法指令
MUL、IMUL
 除法指令
DIV、IDIV
 十進制調整指令
DAA、DAS、
AAA、AAS、AAM、AADpost

 

2 加法指令

 

2.1指令

加法指令: ADD DST, SRC
執行操做: (DST) ← (SRC) + (DST)編碼

 

帶進位加法指令: ADC DST, SRC
執行操做: (DST) ← (SRC) + (DST) + CFspa

 

加1指令: INC OPR
執行操做: (OPR) ← (OPR) + 1code

 

注意:
* 除INC指令不影響CF標誌外,均對條件標誌位有影響。blog

 

2.2 加法指令對條件標誌位的影響

舉例: n=8 bit 帶符號數(-128~127) , 無符號數(0~255)ip

 

例:雙精度數的加法ci

(DX) = 0002H (AX) = 0F365H
(BX) = 0005H (CX) = 8100Hrem

指令序列 ADD AX, CX ; (1)
     ADC DX, BX ; (2) get

(1) 執行後,(AX) = 7465H
       CF=1 OF=1 SF=0 ZF=0
(2) 執行後,(DX) = 0008H
       CF=0 OF=0 SF=0 ZF=0it

 

3減法指令

3.1指令

減法指令: SUB DST, SRC      (subtract)
執行操做: (DST) ← (DST) - (SRC)

 

帶借位減法指令: SBB DST, SRC         (subtract with borrow)
執行操做: (DST) ← (DST) - (SRC) - CF

 

減1指令: DEC OPR     (decrement)
執行操做: (OPR) ← (OPR) - 1

 

求補指令: NEG OPR            (negate)
執行操做: (OPR) ← - (OPR)            (OPR)← 0FFFF - (OPR)+ 2

把操做數按位求反後末位加一

 

比較指令: CMP OPR1, OPR2     (compare)
執行操做: (OPR1) - (OPR2)

 

注意:
* 除DEC指令不影響CF標誌外,均對條件標誌位有影響。

 

3.2對條件標誌位(CF/OF/ZF/SF)的影響

3.2.1減法指令對條件標誌位(CF/OF/ZF/SF)的影響

 

3.2.2NEG 指令對CF/OF的影響

 

例:x、y、z 均爲雙精度數,分別存放在地址爲X, X+2;Y, Y+2;Z, Z+2的存儲單元中,

用指令序列實現w ← x + y + 24 - z ,並用W, W+2單元存放w

MOV  AX,  X
MOV  DX,  X+2
ADD  AX,  Y
ADC  DX,  Y+2      ;  x+y
ADD  AX,  24
ADC  DX,  0        ;  x+y+24
SUB  AX,  Z
SBB  DX,  Z+2      ;  x+y+24-z
MOV  W,   AX
MOV  W+2, DX       ;  結果存入W, W+2單元

 

4乘法指令

4.1指令

無符號數乘法指令: MUL SRC
帶符號數乘法指令: IMUL SRC

 

執行操做:
字節操做數 (AX) ← (AL) * (SRC)
字操做數 (DX, AX) ← (AX) * (SRC)

 

注意:
* AL (AX) 爲隱含的乘數寄存器。
* AX (DX,AX) 爲隱含的乘積寄存器。
* SRC不能爲當即數。
* 除CF和OF外,對條件標誌位無定義

 

 4.2乘法指令對 CF/OF 的影響

 

例:(AX) = 16A5H,(BX) = 0611H

(1) IMUL BL   ; (AX) ← (AL) * (BL)
        ; A5*11 =》 5B*11=060B =》 F9F5
        ; (AX) = 0F9F5H CF=OF=1

(2) MUL BX    ; (DX, AX) ← (AX) * (BX)
        ; 16A5*0611=0089 5EF5
        ; (DX)=0089H (AX)=5EF5H CF=OF=1

 

 5.除法指令

 5.1指令

無符號數除法指令: DIV SRC
帶符號數除法指令: IDIV SRC


執行操做:
字節操做 (AL) ← (AX) / (SRC) 的商
     (AH) ← (AX) / (SRC) 的餘數

字操做 (AX) ← (DX, AX) / (SRC) 的商
    (DX) ← (DX, AX) / (SRC) 的餘數

注意:

* AX (DX,AX) 爲隱含的被除數寄存器。
* AL (AX) 爲隱含的商寄存器。
* AH (DX) 爲隱含的餘數寄存器。
* SRC不能爲當即數。
* 對全部條件標誌位均無定義。如何判別結果有效?

 

例:x , y , z , v 均爲16位帶符號數,計算
( v - ( x*y + z – 540 ) ) / x

MOV   AX, X 
IMUL  Y          ;  x*y →(DX,AX)
MOV   CX, AX
MOV   BX, DX
MOV   AX, Z
CWD              ;Z →(DX,AX)
ADD   CX, AX
ADC   BX, DX     ;  x*y+z →(BX,CX)
SUB   CX, 540 
SBB   BX, 0      ;  x*y+z-540
MOV   AX, V
CWD              ;V →(DX,AX)
SUB   AX, CX
SBB   DX, BX     ;  v-(x*y+z-540)
IDIV  X          ;  (v-(x*y+z-540))/x→(AX)
                                   餘數→(DX)

 

 

 6.十進制調整指令

6.1BCD碼

BCD碼:用二進制編碼的十進制數,又稱二--十進制數  (binary code decimal)
壓縮的BCD碼:用 4 位二進制數表示 1 位十進制數
       例:( 59 )10 =( 0101 1001 )BCD
非壓縮的BCD碼:用 8 位二進制數表示 1 位十進制數
       例:( 59 )10 =( 0000 0101 0000 1001 )BCD

數字的 ASCII 碼是一種 非壓縮的 BCD 碼
DIGIT ASCII BCD
0 30H 0011 0000
1 31H 0011 0001
2 32H 0011 0010
… … …
9 39H 0011 1001

 

例:寫出( 3590 )10的壓縮 BCD 碼和非壓縮BCD碼,並分
別 把它們存入數據區 PAKED 和 UNPAK

壓縮BCD: ( 3590 )10=( 0011 0101 1001 0000 )BCD

非壓縮BCD:
( 3590 )10=( 00000011 00000101 00001001 00000000 )BCD

 

問題的提出:

 

6.2指令

(1)壓縮的BCD碼調整指令
● DAA 加法的十進制調整指令 (decimal adjust for addition)
● DAS 減法的十進制調整指令(decimal adjust for subtraction)


(2)非壓縮的BCD碼調整指令
● AAA 加法的ASCII碼調整指令 (ASCII adjust for addition)
● AAS 減法的ASCII碼調整指令 (ASCII adjust for subtraction)
● AAM 乘法的ASCII碼調整指令 (ASCII adjust for multiplication)
● AAD 除法的ASCII碼調整指令 (ASCII adjust for devision)

 

壓縮BCD運算舉例:
(1)       MOV      AL, BCD1         ; BCD1=34H
           ADD       AL, BCD2         ; BCD2=59H,   (AL)=8DH
           DAA                        ;  8DH+06H=93H
           MOV      BCD3, AL          ; BCD3=93H
(2)       MOV      AL, BCD1          ; BCD1=34H
           SUB        AL, BCD2        ; BCD2=59H ,   (AL)=0DBH
           DAS                        ;  0DBH-60H-06H=75H
           MOV      BCD3, AL          ; BCD3= 75 = - 25  (10^n’補碼)
非壓縮BCD運算舉例:
(1) MUL      BL          ; (AX)=(AL)×(BL)=08 × 09
             AAM          ; (AL)/0AH= 48H /0AH→ 07022)AAD                   ; (AX) →(AH) ×0AH+(AL)=48H
    DIV       BL         ; (AL) = (AX)/(BL)=48H/4=12H
    AAM                   ; (AL)/0AH=12H/0AH=0108

 

 

 

相關文章
相關標籤/搜索