① 用汇编语言编写多字节压缩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
② 实现两个数相减的汇编语言程序
;80x86汇编程序例子:
CLS ;清进桐梁位(借位)标志
MOV BL,0AH ;被减数送BL
MOV CL,05H ;减数银局送锋轮让CL
SUB BL,CL ;两数相减