㈠ 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字符串,