; 相加的两个数以及其和不得超过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: