用汇编语言编写多字节压缩bcd码减法程序,要求显示被减数,减数及结果
发布网友
发布时间:2024-10-21 22:04
我来回答
共1个回答
热心网友
时间:2024-11-18 06:03
;修改'899',和'999'的长度,即可计算任意长度的相加
;如d10 db '18929387499'
; d12 db '18234287439'
; 补充,这是相加,你要求是相减,搞差了,减法的附在后面
dseg segment
d10 db '899'
len1 equ $-d10 ;注意 d10与d12长度相同,可以做不同,但比较麻烦,这里没做
d11 db '+'
d12 db '999' ;长度与d10相同
d13 db '=','$'
d2 db len1+1 dup(0),'$'
dseg ends
assume cs:cseg, ds:dseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov ah,9
lea dx, d10
int 21h
lea si, d10
lea di, d12
lea bx, d2
add si, len1-1 ;指向个位数位置
add di, len1-1 ;指向个位数位置
add bx, len1 ;指向个位数位置
mov cx, len1 ;计算器
clc ;清除cf
c0:
mov ah,0 ;清除ah
mov al,[si] ;取对应位置上的数字相加
and al,0FH ;
mov dl,[di] ;
and dl,0FH ;
add al,dl ;相加
aaa ;调整
add al,[bx] ;加上可能的进位
aaa ;再调整
mov [bx],al ;保存到对应的位置上
mov [bx-1],ah;可能存在的进位,保存到对应的位置上
dec si ;下一位相加
dec di
dec bx
loop c0
mov cx, len1+1
lea bx, d2
c1:
xor byte ptr [bx], 30H ;将结果转换为ascII值
inc bx
loop c1
mov cx, len1
lea bx, d2
c2:
mov al, [bx] ;查找结果中,第1个结果不是0的数字
cmp al, 30H ;从此开始显示结果,以免出现0123这样的结果
jnz p0
inc bx
loop c2
p0:
mov dx,bx
mov ah,9
int 21h
mov ah,4ch
int 21h
cseg ends
end start
;这是减法的代码
;有个bug,被减数必须大于减数时才正确。
;暂时先这样
dseg segment
d10 db '991'
len1 equ $-d10 ;注意 d10与d12长度相同,可以做不同,但比较麻烦,这里没做
d11 db '-'
d12 db '192' ;长度与d10相同
d13 db '=','$'
d2 db len1+1 dup(0),'$'
dseg ends
assume cs:cseg, ds:dseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov ah,9
lea dx, d10
int 21h
lea si, d10
lea di, d12
lea bx, d2
add si, len1-1 ;指向个位数位置
add di, len1-1 ;指向个位数位置
add bx, len1 ;指向个位数位置
mov cx, len1 ;计算器
clc ;清除cf
c0:
mov ah,0 ;清除ah
mov al,[si] ;取对应位置上的数字相加
and al,0FH ;
mov dl,[di] ;
and dl,0FH ;
sub al,[bx] ;减去可能的借位
aas ;再调整
sub al,dl ;相减
aas ;调整
neg ah ;如有借位,转换为正数1
mov [bx],al ;保存到对应的位置上
mov [bx-1],ah;可能存在的进位,保存到对应的位置上
dec si ;下一位相加
dec di
dec bx
loop c0
mov cx, len1+1
lea bx, d2
c1:
xor byte ptr [bx], 30H ;将结果转换为ascII值
inc bx
loop c1
mov cx, len1
lea bx, d2
c2:
mov al, [bx] ;查找结果中,第1个结果不是0的数字
cmp al, 30H ;从此开始显示结果,以免出现0123这样的结果
jnz p0
inc bx
loop c2
p0:
mov dx,bx
mov ah,9
int 21h
mov ah,4ch
int 21h
cseg ends
end start