用8086汇编语言实现两个无符号32位二进制数相加,并显示结果。注:输入、输出都采用10进制形式;

用8086汇编语言实现两个无符号32位二进制数相加,并显示结果。注:输入、输出都采用10进制形式;从键盘输入,输入时以空格间隔两个数,以回车符结束输入;算术运算要求采用二进制进行,不允许采用10进制BCD数计算。

; 相加的两个数以及其和不得超过6.5亿,否则出现除法溢出
; 输入的两个数存入数组x 中 (输入时,两个数以空格间隔,以回车结束输入)
; 相加的结果存入y 中,或dx、ax中
code  segment
      assume cs:code
      org 100h
START:
      JMP BBB
X     DD 10 dup(?)
num   dw ?
Y     DD ?
cc    db 10 dup(' '),10,13,'$'
lfcr  db 10,13,'$'
      ; ===================
bbb:
      push cs
      pop ds
      push cs
      pop es
      lea si,x
      mov word ptr num,0
m0:
      mov ax,0
      mov dx,0
      push ax
      push dx
m1:
      mov ah,1
      int 21h
      cmp al,20h
      je mexit1
      cmp al,13
      je mexit2
      sub al,30h
      mov bh,0
      mov bl,al
      mov di,bx
      ; ==============
      pop dx
      pop ax
      shl ax,1
      rcl dx,1
      mov bx,ax
      mov cx,dx
      shl ax,1
      rcl dx,1
      shl ax,1
      rcl dx,1
      add ax,bx
      adc dx,cx
      ; ===============
      mov bx,di
      add ax,bx
      adc dx,0
      push ax
      push dx
      jmp m1
mexit1:
      pop dx
      pop ax
      mov [si],ax
      mov [si+2],dx
      add si,4
      inc word ptr num
      jmp m0
mexit2:
      pop dx
       pop ax
      mov [si],ax
      mov [si+2],dx
      inc word ptr num
      ; 以上完成两个数的输入、转换为16进制数并保存
      ; ===================
      lea si,x
      mov ax,[si]
      mov dx,[si+2]
      mov bx,[si+4]
      mov cx,[si+6]
      add ax,bx
      adc dx,cx
      lea si,y
      mov [si],ax
      mov [si+2],dx
      ; 以上完成两个数的相加 并保存到 Y中
      ; ===============
      ; 以下将 Y (16进制)转为10进制串并输出
      lea di,cc
      add di,9
m2:
      mov bx,10000
      div bx    ; 这里是发生溢出之处
      push ax
      push dx
      ; ============
      ; 以下转换10进制的低4位
      pop dx
      mov cx,4
      mov ax,dx
m3:   mov dx,0
      mov bx,10
      div bx
      add dl,30h
      mov [di],dl
      dec di
      loop m3
      ; ===========
      ; 以下转换10进制的高5位
      pop ax
      mov cx,5
m4:   mov dx,0
      mov bx,10
      div bx
      add dl,30h
      mov [di],dl
      dec di
      loop m4
      ; ============
      ; 输出换行回车
      lea dx,lfcr
      mov ah,9
      int 21h
      ; ============
      ; 输出两数的和的10进制串
      lea dx,cc
      mov ah,9
      int 21h
      ; ============
      ;int 3
      mov ah,4ch
      int 21h
code  ends
      end start

追问

超过6.5亿如何做呢?

追答

以上代码中插入以下代码在做微调即可:
;jmp mm1
; 以上完成两个数的相加 并保存到 Y中
; ===============
; 以下将 Y (16进制)转为10进制串并输出
mov ax,word ptr [y] ;=====
mov dx,word ptr [y+2] ;=====
mov bx,word ptr [z] ;===== 这一段是关键,加上后不会出现除法溢出
mov cx,word ptr [z+2] ;=====
mov word ptr n,0 ;=====
mm0: inc word ptr n ;=====
sub ax,bx ; 不停地减 10万 ,得到被10万除的商,放在 n 中
sbb dx,cx ;=====
jnc mm0 ;=====
dec word ptr n ; 保存 高5位
add ax,bx ;=====
adc dx,cx ;=====
mov word ptr[y],ax ;=====
mov word ptr[y+2],dx ;=====
;==============
mm1: lea di,cc
add di,9
m2:

温馨提示:答案为网友推荐,仅供参考
相似回答