彙編(十) 算術運算類指令

2021-04-15 00:58:15 字數 3648 閱讀 4512

術運算類指令用來執行二進位制及十進位制的算術運算:加減乘除。

這類指令會根據運算結果影響狀態標誌,有時要利用某些標誌才能得到正確的結果。

一、加法指令

1、加法指令add

add  reg,imm/reg/mem       ;reg←reg+imm/reg/mem

add  mem,imm/reg           ;mem←mem+imm/reg

add指令按照狀態標誌的定義相應的設定這些標誌的0或1狀態。

2、帶進製標誌加法指令adc

adc  reg,imm/reg/mem    ;reg←reg+imm/reg/mem+cf

adc  mem,imm/reg        ;mem←mem+imm/reg+cf

adc指令除完成add加法指令運算外,還要加進制cf。

3、增量指令inc

inc  reg/mem       ;reg/mem←reg/mem+1

inc指令對運算元加1(增量)。它是乙個單運算元指令。

設計加1指令和後面介紹的減1指令的目的,主要是用於對計數器和位址指標的調整,所以他們不影響進製cf標誌,對其他標誌位的影響與add,adc相同。

二、減法指令

1、減法指令sub

sub  reg,imm/reg/mem    ;reg←reg-imm/reg/mem

sub  mem,imm/reg        ;mem←mem/reg

2、帶借位減法指令sbb

sbb  reg,imm/reg/mem    ;reg←reg-imm/reg/mem-cf

sbb  mem,imm/reg        ;mem←mem-imm/reg-cf

3、減量指令dec

dec reg/mem             ;reg/mem←reg/mem-1

同樣不影響cf標誌。

4、求補指令neg

neg  reg/mem            ;reg/mem←0-reg/mem

neg指令也是乙個單運算元指令,它對運算元執行求補運算,即用零減去運算元,然後結果返回運算元。求補運算也可以表達成:將運算元按位求反後加1。

5、比較指令cmp

cmp  reg,imm/reg/mem    ;reg-imm/reg/mem

cmp  mem,imm/reg        ;mem-imm/reg

該指令將目的運算元減去源運算元,但結果不回送目的運算元。也就是說cmp指令與減法指令sub執行相同的操作,同樣影響標誌,只是不改變目的運算元。cmp指令用於比較兩個運算元的大小關係。執行比較指令之後,可以根據標誌判斷兩個數是否相同、大小關係等。所以,cmp指令後常跟條件轉移指令,根據比較結果不同產生不同的分支。

三、乘法指令

1、無符號數乘法指令mul

mul指令執行無符號二進位制數的乘法運算:

mul  r8/m8          ;無符號位元組乘:ax←al×r8/m8

mul  6/6            ;無符號字乘:dx.ax←ax×r16/m16

乘法指令隱含使用乙個運算元ax和dx,源運算元則顯式給出,可以是暫存器或儲存單元。mul指令影響標誌of和cf。

2、有符號數乘法指令imul

imul r8/m8           ;有符號數字節乘:ax←al×r8/m8

imul r16/m16         ;有符號數字乘:dx.ax←ax×r16/m16

四、除法指令

1、無符號數除法指令div

div r8/m8            ;無符號位元組除法:al←ax÷r8/m8的商,ah←ax÷r8/m8的餘數

div r16/m16          ;無符號字除法:ax←dx.ax÷r16/m16的商,dx←dx.ax÷r16/m16的餘數。

2、有符號數除法指令idiv

idiv r8/m8

idiv r16/m16

五、符號擴充套件指令

符號擴充套件是指用乙個運算元的符號位(即最高位)形成另乙個運算元,後乙個運算元的各位是全0(正數)或全1(負數)。符號擴充套件指令可用來將位元組轉換為字,字轉換為雙字。均不影響標誌位。

1、位元組轉換為字指令cbw

cbw        ;al符號擴充套件成ax

cbw指令將al的最高有效位d7擴充套件至ah,即:如果al的最高有效位是0,則ah=00;al的最高有效位為1,則ah=ffh。al不變。

2、字轉換為雙字指令cwd

cwd     ;ax符號擴充套件成dx

指令將ax的內容符號擴充套件形成dx,即如果ax的最高有效位d15位0,則dx=0000h,如果ax的最高有效位為1,則dx=ffffh.

符號擴充套件指令常用來獲得除法指令所需要的被除數。

六、十進位制調整指令

十進位制調整指令對二進位制運算結果進行十進位制調整,以得到十進位制的運算結果。十進位制在計算機中也要用二進位制表示,這就是十進位制編碼的十進位制數:bcd碼。8086支援壓縮的bcd碼和非壓縮的bcd碼,相應的十進位制調整指令分為壓縮bcd碼調整指令和非壓縮bcd碼調整指令。

1、壓縮bcd碼調整指令

壓縮的bcd碼是通常的8421碼,它用4個二進位制位表示乙個十進位制位,乙個位元組可以表示兩個十進位制位,即00~99。

(1)加法的十進位制數調整指令daa

daa      ;al←將al中的加和調整為壓縮bcd碼

該指令跟在以al為目的運算元的add或adc指令之後,對al的二進位制結果進行十進位制調整,並在al得到十進位制結果。daa指令對of標誌無定義,按其結果影響所有其他標誌,其中cf反映壓縮bcd碼相加的進製狀態。

(2)減法的十進位制調整指令das

das      ;al←將al中的減差調整為壓縮bcd碼

2、非壓縮bcd碼調整指令

非壓縮bcd碼用8個二進位制位表示乙個十進位制位。

(1)加法的非壓縮bcd碼調整指令aaa

aaa          ;al←將al中的加和調整為非壓縮bcd碼,ah←ah+調整產生的進製

該指令跟在以al為目的運算元的add或adc指令之後,對al進行非壓縮bcd碼調整;如果調整中產生了進製,則將進製1加到ah中,同時cf=af=1;否則cf=af=0。aaa指令對其他標誌無定義。使al的高4位清0。

(2)減法的非壓縮bcd碼調整指令aas

aas      ;al←將al中的減差調整為非壓縮bcd碼,ah←ah-調整產生的借位

該指令跟在以al為目的運算元的sub或sbb指令之後,對al進行非壓縮bcd碼調整;如果調整中產生了借位,則將ah減去借位1,同時cf=af=1;否則cf=af=0.

(3)乘法的非壓縮bcd碼調整指令aam

aam   ;ax←將ax中的乘積調整為非壓縮bcd碼

該指令跟在以ax為目的運算元的mul指令之後,對ax進行非壓縮bcd碼調整。利用mul相乘的兩個非壓縮bcd碼的高4位必須為0。aam指令根據結果設定sf、zf和pf,但of、cf、af無定義。

(4)除法的非壓縮bcd碼調整指令aad

aad      ;ax←將ax中的非壓縮bcd碼擴充套件成二進位制數,即:al←10d×ah+al,ah←0

aad調整指令與其他的調整指令應用情況不同。他先將存放在ax暫存器中的兩位非壓縮bcd碼數進行調整,然後再用div指令除以乙個非壓縮bcd碼數,這樣得到非壓縮bcd碼數的除法結果。其中,要求al、ah和除數的高4位為0。aad指令根據結果設定sf、zf和pf,但of、cf和af無定義。

組合語言 算術運算類指令

知識回顧 幾個重要標誌位的含意 cf 進製標誌 1 算術操作最高位產生了進製或借位 0 最高位無進製或借位 pf 奇偶標誌 1 資料最低8位中1的個數為偶數 0 資料最低8位中1的個數為奇數 af 輔助進製標誌 1 d3 d4位產生了進製或借位 0 d3 d4位無進製或借位 zf 零標誌 1 操作結...

8086算術運算類指令

算術運算指令 加法類指令 減法類指令 乘法指令 除法指令 bcd嗎指令 一 加法類指令 首先我麼們先看加法類指令三個 add,adc,inc 1 不帶進製位的加法指令add add用來執行2個位元組或2個字的相加操作,運算時不考慮cf位 add影響of,sf,zf,af,pf,cf標誌 2 帶進製位...

彙編指令速查 之二 算術運算指令

add 加法.adc 帶進製加法.inc 加 1.aaa 加法的ascii碼調整.daa 加法的十進位制調整.sub 減法.sbb 帶借位減法.dec 減 1.nec 求反 以 0 減之 cmp 比較.兩運算元作減法,僅修改標誌位,不回送結果 aas 減法的ascii碼調整.das 減法的十進位制調...