用汇编语言编写多字节压缩bcd码减法程序,要求显示被减数,减数及结果

 我来答
pardream941026
2018-01-06 · TA获得超过8217个赞
知道大有可为答主
回答量:4602
采纳率:89%
帮助的人:1335万
展开全部
;修改'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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式