㈠ 2位元組BCD碼減法 匯編程序
BCD碼相減等於加上減數的補數。如55-22 就是55+(100-22)=133,丟掉進梁豎位之後,就能得到正確的結果。由於影弊渣派響進位,因此CY會變為1的。
具體程序如下租賀:
CLR C
MOV A, #9AH ;做100-22的減法
SUBB A, #22H
ADD A, #55H
DA A
㈡ 一個很簡單的計算加減法的匯編程序,急求~
;已實現,下面是完成程序,其中加減比較簡單,關鍵是將結果輸出,注釋在程序中穿插
code segment
assume cs:code
start:
mov bx,166
mov ax,55
mov cx,44
add bx,ax ;166+55存於BX中
add ax,cx ;55+44存於AX中
sub bx,ax ;結果存於BX中
call bini ;調用bini,將存於BX中的結果按十進制輸出到屏幕
mov ah,4ch
int 21h
;-----------------------
;針對多位數,依次分解,然後輸出,從最高位開始輸出
;為了更好的理解此段程序,鍵悶最好拿具體數據比如111代入橋蔽,敏亮州查看程序的執行流程
bini proc near
;mov cx,1000d
;call bin
mov cx,100d;若結果超過三位數,在此句前面添加類似代碼即可,如結果是四位,則添加如上
call bin
mov cx,10d
call bin
mov cx,1d
call bin
ret
bini endp
bin proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
ret
bin endp
;----------------------
code ends
end start
㈢ 用匯編語言在Masm中編寫減法運算
mov ah,1
int 21h
mov add1,al
mov dl,'慶衡-'
mov ah,2
int 21h
mov ah,1
int 21h
mov add2,al
mov dl,'碧茄='譽慧做
mov ah,2
int 21h
mov ah,add1
mov al,add 2
sub ah,al
mov sum,ah
jae next
push ax
mov dl,'-'
mov ah,2
int 21h
pop ax
neg ah
next:
mov dl,ah
add dl,30h
mov ah,2
int 21h
mov ah,1
int 21h
㈣ 兩個十六位二進制數相減,完整匯編語言程序
對於86而言,有直接的16位減法指令,所以這個題目的CPU應該是8位單片機,以51單片機為例祥運伍,悄悄先將借位清零,低八位相減法,再高八位帶借位減,類似於列式減法運算一樣。程序如下:
; (R3R4-R6R7)=(R3R4)
;入口: R3,R4,R6,R7
;出口: R3,R4
NSUB :
MOV A,R4
CLR C ;借位清零
SUBB A,R7 ;低八位相減
MOV R4,A ;保存低八位結果
MOV A,R3
SUBB A,R6 ;高八位帶借位減
MOV R3,A ;保存高八位結果謹或
RET
㈤ 匯編語言中的加減法
(加減指令,既作為無符號數影響標志位CF,AF,又作為有符號數影響標志OF,SF。想了半天終於搞清楚了,CF標志反映最高位的進借位情況,而OF反映結果是否溢出,這里的結果是目的操作數中的結果,進借位它是不管的。你這樣想的原因是,考慮到CF為1,則肯定溢出了,但是目的操作數中只能保存溢出後的值,丟掉了最高位,所以就不一定溢出了。看例子:
MOV
AX,7896H;
ADD
AL,AH;
;執行完後CF=1,AL=0EH,但是OEH不溢出,所以OF=0;
後面一句也不對吧。)
以上是我個人的理解。
以下是復制別人粗御仿的理解:
CF
比較簡單吧,
沒有什麼特別的.
OF
表示的帶符號數進行運算是否溢出.
96+78,
一個是正數,
一個為負數,
相加肯定是不會有溢出的.
OF
溢出只可能發生在兩個相同符號的數值相加,
或岩纖者是不同符號數相減.
如果是從演算法判斷上來看,
如果是在運算時,
次高位向最高位和最高位向拆衫
CF
位產生進位情形一致的話,
OF=0;
否則
OF=1.
96
10010110
+78
01111000
10E
100001110
這里,
次高位和最高位都產生了進位,
情形一致,
所以
OF=0
16
00010110
+78
01111000
08E
10001110
這里,
次高位向最高位產生了進位,
而最高位沒有向
CF
產生進位,
所以
OF=1
而且,
結果也是,
兩個正數相加,
結果為負數了,
顯然溢出
還有兩種情況,
也是類似的.
一個是都沒有產生進位,
那應該是兩個小的正數相加,
結果還是正數,
沒有溢出;
另外就是次高位沒有產生進位,
但最高位產生進位了,
這應該是兩個負數相加,
由於次高為位沒有產生進位,
所以,
最高位,
也就是符號位結果為
0,
是正數,
顯然也是溢出了.
㈥ 匯編語言中的減法
不是,是用被減數加上減數的補碼
步驟(不是氏脊改計算機計算的步驟,我想的步驟):
56H求補
01010110B各位取反+1
10101001B+1=10101010B
被減數+減殲判數補碼
10010000B+10101010B=[1]00111010B=3AH(最高位捨去)
都是再位元組層次上做的運算,所以結果的最高位捨去了野世
㈦ 關於王爽的匯編語言的加減乘除指令
匯編算術運算指令
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操作。
㈧ 實現兩個數相減的匯編語言程序
;80x86匯編程序例子:
CLS ;清進桐梁位(借位)標志
MOV BL,0AH ;被減數送BL
MOV CL,05H ;減數銀局送鋒輪讓CL
SUB BL,CL ;兩數相減
㈨ 用匯編語言編寫多位元組壓縮bcd碼減法程序,要求顯示被減數,減數及結果
;修改'899',和'999'的長度,即可計算任意長度的相加
;如d10db'18929387499'
;d12db'18234287439'
;補充,這是相加,你要求是相減,搞差了,減法的附在後面
dsegsegment
d10db'899'
len1equ$-d10;注意d10與d12長度相同,可以做不同,但比較麻煩,這里沒做
d11db'+'
d12db'999';長度與d10相同
d13db'=','$'
d2dblen1+1p(0),'$'
dsegends
assumecs:cseg,ds:dseg
csegsegment
start:
movax,dseg
movds,ax
movah,9
leadx,d10
int21h
leasi,d10
leadi,d12
leabx,d2
addsi,len1-1;指向個位數位置
adddi,len1-1;指向個位數位置
addbx,len1;指向個位數位置
movcx,len1;計算器
clc;清除cf
c0:
movah,0;清除ah
moval,[si];取對應位置上的數字相加
andal,0FH;
movdl,[di];
anddl,0FH;
addal,dl;相加
aaa;調整
addal,[bx];加上可能的進位
aaa;再調整
mov[bx],al;保存到對應的位置上
mov[bx-1],ah;可能存在的進位,保存到對應的位置上
decsi;下一位相加
decdi
decbx
loopc0
movcx,len1+1
leabx,d2
c1:
xorbyteptr[bx],30H;將結果轉換為ascII值
incbx
loopc1
movcx,len1
leabx,d2
c2:
moval,[bx];查找結果中,第1個結果不是0的數字
cmpal,30H;從此開始顯示結果,以免出現0123這樣的結果
jnzp0
incbx
loopc2
p0:
movdx,bx
movah,9
int21h
movah,4ch
int21h
csegends
endstart
;這是減法的代碼
;有個bug,被減數必須大於減數時才正確。
;暫時先這樣
dsegsegment
d10db'991'
len1equ$-d10;注意d10與d12長度相同,可以做不同,但比較麻煩,這里沒做
d11db'-'
d12db'192';長度與d10相同
d13db'=','$'
d2dblen1+1p(0),'$'
dsegends
assumecs:cseg,ds:dseg
csegsegment
start:
movax,dseg
movds,ax
movah,9
leadx,d10
int21h
leasi,d10
leadi,d12
leabx,d2
addsi,len1-1;指向個位數位置
adddi,len1-1;指向個位數位置
addbx,len1;指向個位數位置
movcx,len1;計算器
clc;清除cf
c0:
movah,0;清除ah
moval,[si];取對應位置上的數字相加
andal,0FH;
movdl,[di];
anddl,0FH;
subal,[bx];減去可能的借位
aas;再調整
subal,dl;相減
aas;調整
negah;如有借位,轉換為正數1
mov[bx],al;保存到對應的位置上
mov[bx-1],ah;可能存在的進位,保存到對應的位置上
decsi;下一位相加
decdi
decbx
loopc0
movcx,len1+1
leabx,d2
c1:
xorbyteptr[bx],30H;將結果轉換為ascII值
incbx
loopc1
movcx,len1
leabx,d2
c2:
moval,[bx];查找結果中,第1個結果不是0的數字
cmpal,30H;從此開始顯示結果,以免出現0123這樣的結果
jnzp0
incbx
loopc2
p0:
movdx,bx
movah,9
int21h
movah,4ch
int21h
csegends
endstart
㈩ 用匯編語言寫多位元組二進制減法,用十六進制顯示結果,減數,被減數。求程序
首先建立輸入子程序,可以輸入二進制數,先是被減數,然後減數,
(調用鍵盤讀取功能,把讀進來的字元串放到一個地方,直到回車結束)
其次進行運算,把字元串變成數字,判讀字元,是1就加入X,然後乘2,或者左移,
依次變化讀入的字元串到X,Y,然後進行運算。
然後把結果放到Z,把Z變成16進制的字元串。比如從最低位取四位二進制數,如果是0~9,那就變成ASCII碼,對應48~58,如果是10~15,就對應A~F
然後建立輸出子程序 輸出運算結果Z字元串,