關於王爽的組合語言的加減乘除指令

2021-03-07 07:50:09 字數 4429 閱讀 8736

1樓:匿名使用者

王爽組合語言加減乘除指令分述如下:

1、 加法指令

指令格式: 加法 add dst, src; (dst)←(src)+(dst)

帶進位加法 adc dst, src; (dst)←(src)+(dst)+cf

加1 inc opr; (opr)←(opr)+1

2、 減法指令

指令格式:

減法 sub dst,src ; (dst)←(dst)-(src)

帶進位減法 sbb dst,src ; (dst)←(dst)-(src)-cf

減1 dec opr ; (opr)←(opr)-1

求補 neg opr ; (opr)←0ffffh-(0pr)+1

比較 cmp opr1, opr2 ; (opr1)-(opr2)

3、 乘法指令

乘法運算分為無符號數運算和有符號數運算,各有相應的指令,並使用雙運算元。兩個8位二進位制數相乘,積為16位二進位制數;兩個16位二進位制數相乘,積為32位二進位制數。

指令格式:

無符號數乘法 mul src;(ax)←(al)×(src)8位數乘法

(dx,ax)←(ax)×(src)16位數乘法

帶符號數乘法 imul src; 操作同上,但是運算元為帶符號數

4、 除法指令

除法運算分為無符號數運算和有符號數運算,各有相應的指令,並使用雙運算元。當除數是8位或16位二進位制數時,要求被除數是16位或32位的二進位制數。

指令格式:

無符號數除法 div src;(al)←(ax)/(src)8位二進位制數除法的商

(ah)←(ax)/(src)8位二進位制數除法的餘數

或(ax)←(dx,ax)/(src) 16位二進位制數除法的商

(dx)←(dx,ax)/(src) 16位二進位制數除法的餘數

帶符號數除法 idiv src; 操作同上,但是運算元為帶符號數

2樓:匿名使用者

彙編算術運算指令

8086的算術運算類指令能夠對二進位制或十進位制(bcd碼)數進行加、減、乘、除運算,運算元的資料形式可以是8位或16位的無符號數或帶符號數。對於單運算元指令,不允許使用立即數形式;對於雙運算元指令,只有源操作可以使用立即數,兩個運算元中必須有一個在暫存器中。

1. 加法指令指令格式: 加法 add dst, src; (dst)←(src)+(dst)

帶進位加法 adc dst, src; (dst)←(src)+(dst)+cf

加1 inc opr; (opr)←(opr)+1

注意: 這三條指令運算結果將影響狀態標誌位,但是inc指令不影響標誌cf。下面以8位數加法運算為例作簡要說明。

[例4.20]因為運算結果沒有超出單位元組無符號數範圍,所以cf=0;運算結果超出單位元組有符號數範圍,所以of=1;其他標誌 zf=0,sf=1。 以上運算可以用兩條指令實現:

mov ah,01 add ah,7fh

adc指令主要用於多位元組或多精度資料相加的運算。 例如進行二組四位元組(雙精度)數1122 3344h和5566 7788h的相加運算時,使用單位元組加法指令需要執行4次加法運算,運算過程中,通過adc指令將低位元組運算產生的進位加到高位位元組,而使用字加法指令,只需要執行兩次加法運算,當然也必須通過adc指令處理低字運算產生的進位。使用adc指令,必須先將cf標誌置0。

2. 減法指令

指令格式:

減法 sub dst,src ; (dst)←(dst)-(src)

帶進位減法 sbb dst,src ; (dst)←(dst)-(src)-cf

減1 dec opr ; (opr)←(opr)-1

求補 neg opr ; (opr)←0ffffh-(0pr)+1

比較 cmp opr1, opr2 ; (opr1)-(opr2)

sbb指令主要用於多位元組或多精度資料相減的運算;neg指令對運算元進行取反加1的操作;cmp指令類似sub指令執行減法操作,但不產生運算結果,對標誌位影響見表4.3。 這幾條指令的運算結果都影響狀態標誌位,只是dec指令不影響標誌cf。

[例4.22]

直接相減算式結果為: (4006ah)=520fh,sf=0,zf=0,cf=0,of=0

補碼加法算式結果為: (4006ah)=520fh,sf=0,zf=0,cf=1,of=0

算式中fecah是(-0136h)的補碼。

可見,兩種算式中運算結果是相同的,但是對標誌cf的影響不同,因為是減法運算,正確結果應是cf=0。用補碼加法得到運算結果cf=1,應求反後送入cf。 表4-3 cmp指令對狀態標誌位的影響

3. 乘法指令 乘法運算分為無符號數運算和有符號數運算,各有相應的指令,並使用雙運算元。兩個8位二進位制數相乘,積為16位二進位制數;兩個16位二進位制數相乘,積為32位二進位制數。

指令格式:

無符號數乘法 mul src;(ax)←(al)×(src)8位數乘法

(dx,ax)←(ax)×(src)16位數乘法

帶符號數乘法 imul src; 操作同上,但是運算元為帶符號數

注意:進行位元組運算時,目的運算元必須是累加器al,乘積在暫存器ax中;進行字運算時,目的運算元必須是累加器ax,乘積在暫存器dx、ax中。源運算元不允許使用立即數定址方式。

乘法指令運算結果隻影響狀態標誌cf、of,對其他狀態標誌位無影響(狀態不定)。

對於 mul 指令,如果位元組型資料相乘之積(ah)=0或字資料相乘之積(dx)=0,則cf=of=0,否則cf=of=1;對於imul指令,如果位元組資料相乘之積ah或字資料相乘之積dx的內容是低一半的符號擴充套件,則cf=of=0,否則cf=of=1。

4. 除法指令 除法運算分為無符號數運算和有符號數運算,各有相應的指令,並使用雙運算元。當除數是8位或16位二進位制數時,要求被除數是16位或32位的二進位制數。指令格式:

無符號數除法 div src;(al)←(ax)/(src)8位二進位制數除法的商

(ah)←(ax)/(src)8位二進位制數除法的餘數

或(ax)←(dx,ax)/(src) 16位二進位制數除法的商

(dx)←(dx,ax)/(src) 16位二進位制數除法的餘數

帶符號數除法 idiv src; 操作同上,但是運算元為帶符號數

注意:當除數是位元組資料時,被除數必須放在ax中,當除數是字資料時,被除數必須放在dx,ax中。

除法指令運算結果對狀態標誌無定義(狀態不定)。但是,若除數為0或帶符號數,則當除法運算結果超出規定的範圍時,將產生0號中斷,與溢位標誌of無關。

8086/8088 規定 idiv 指令運算結果餘數的符號與被除數相同。

帶符號數除法運算中,當被除數位數不夠時,則需將被除數擴充套件到所需的位數。8086/8088設有帶符號數擴充套件指令。

指令格式:

位元組擴充套件到字cbw;將暫存器al中的符號位擴充套件到暫存器ah

字擴充套件到雙字cwd;將暫存器ax中的符號位擴充套件到暫存器dx

這兩條指令不影響標誌位。

5. 十進位制調整指令 bcd碼是一種用二進位制編碼的十進位制數,又稱為二—十進位制數。8086/8088中bcd碼分為兩種形式:

其一是用四位二進位制數表示一位十進位制數,稱為壓縮的bcd碼;其二是用八位二進位制數表示一位十進位制數,稱為非壓縮的bcd碼,它的低四位是bcd碼,高四位沒有意義。由於bcd碼是四位二進位制編碼,四位二進位制數共有16個編碼,bcd碼只用其中的10個,其餘沒用的編碼稱為無效碼。bcd碼運算結果進入或跳過無效碼區時,都會出現錯誤。

為了得到正確結果,必須進行調整。8086/8088針對壓縮bcd碼和非壓縮bcd碼,分別設有兩組十進位制調整指令,其調整方法略有不同。

(1) 壓縮bcd碼十進位制調整指令指令格式:

加法十進位制調整daa;(al)←把al中的和調整到壓縮bcd碼格式

減法十進位制調整das;(al)←把al中的差調整到壓縮bcd碼格式

調整方法是:

累加器al低4位大於9或輔助進位標誌位af=1,則累加器al加06h修正。累加器al高4位大於9或進位標誌位cy=1,則累加器al加60h修正。累加器al高4位大於等於9,低4位大於9,則累加器al進行加66h修正。

[例4.26]進行bcd碼加法運算59+68=127

此例中,bcd碼加法結果的低四位使af=1,高四位大於9,所以加66h進行修正。

注意: 壓縮bcd碼加法或減法十進位制調整指令必須用在add(adc)或sub(sbb)指令之後,調整結果對標誌of無影響,對其他狀態標誌位均有影響。

減法十進位制調整方法與加法十進位制調整類同,只是將加6變為減6操作。

3樓:做而論道

樓主並沒有寫出來加法指令。

看來,你也不知道什麼是加法指令。

那麼,告訴你其它指令,你也不知道對錯。

看書去吧。

書上都有。

有看不懂的,再來提問。

王爽組合語言實驗10除法溢位公式疑惑

把一個 32 位的數字 x,分成兩個 16 位的暫存器存放,如 dx 為高字,ax 為低字。用語言描述 x 時,就要說 x dx 65536 ax。程式設計時,分開存放,就行了。並不需要真的乘以 65536。其實相當於用c語言中的陣列,來解決,比如兩個陣列第一個放12第二個放34 現在把第一個陣列放...

關於組合語言的迴圈問題,關於組合語言中的PUSH問題。

你理解bai從程式上面執行下來到du達 loop s後又去執行標zhi號s處,這沒錯。然dao後就內無限迴圈死,這就錯了容 組合語言的迴圈指令loop是有條件的,這個隱含操作和條件就是每迴圈一次,cx cx 1,如果cx 0,迴圈就結束了。在這個程式中,迴圈3次結束。關於組合語言中的push問題。每...

關於組合語言的題目請教,一個關於組合語言的問題?

貪吃蛇,俄羅斯方塊 日曆表示式計算器 有什麼為題說出來交流交流 一個關於組合語言的問題?led equ po 定義bailed代表p0口 num equ 18h 定義num為18hequ是一個偽指令du,你zhi 可以理解為賦值dao的意思,該處定義的情況回編譯時遇到答led將用p0代替,遇到num...