;计算 a + b,其中a b的位数可以在 0 - 2^15 之间,默认位数为 50
;注意 a,b 必须为正数否则结果不正确
;******************************************************************
.model small
.const
MAX equ 50 ;加数的最大位数
.data
a db MAX,MAX dup(?)
b db MAX,MAX dup(?)
txta db 'Enter a:$'
txtb db 'Enter b:$'
result db 'a + b = $'
enter db 13,10,'$'
.code
;------------------------------------------------------------------
;子程序,在屏幕上打印回车
;------------------------------------------------------------------
PtEnter proc near
mov dx,offset enter
mov ah,09h
int 21h
ret
PtEnter endp
;------------------------------------------------------------------
;在提示下输入数据,提示信息为 si ,数据输入到 di
;------------------------------------------------------------------
GetData proc near
mov dx,si
mov ah,09h
int 21h
mov dx,di
mov ah,0ah
int 21h
call PtEnter
ret
GetData endp
;------------------------------------------------------------------
;主过程
;------------------------------------------------------------------
main proc far
mov ax,@data
mov ds,ax
mov si,offset txta
mov di,offset a
call GetData
mov si,offset txtb
mov di,offset b
call GetData
mov si,offset a
inc si
mov byte ptr [si],0dh ;设置哨兵
inc si
mov di,offset b
inc di
mov byte ptr [di],0dh ;设置哨兵
inc di
scana: cmp byte ptr [si],0dh
jz scanb
inc si
jmp scana
scanb: cmp byte ptr [di],0dh
jz scanover
inc di
jmp scana
;开始计算
scanover:
mov bx,10 ;bh 用来存每次除10后的商(0,1),bl存10
mov ax,0dh ;堆栈中的‘哨兵’
push ax
mov cx,0 ;初始化
;从 a 中取数存入 dh
next: mov dh,ch
cmp ch,0dh
jz nextb
dec si
mov dh,byte ptr [si]
;从 b 中取数存入 dl
nextb: mov dl,cl
cmp cl,0dh
jz calc
dec di
mov dl,byte ptr [di]
;计算,并将结果存入堆栈中
calc: xor ax,ax ;清 0
mov cx,dx ;保存取数的结果
cmp dh,0dh
jz overa
add al,dh
sub al,30h ;ASCLL 码转为 二进制
overa: cmp dl,0dh
jz overb
add al,dl
sub al,30h ;ASCLL 码转为 二进制
overb: add al,bh
div bl
mov bh,al ;除10后的商
mov al,ah
add al,30h
mov ah,0
push ax ;除10后的余数(ah)入栈
cmp cx,0d0dh ;是否结束
jnz next
;从堆栈中弹出结果并打印
cmp ax,30h ;检查最后进栈的是否为 0
jnz nocarray
pop dx
nocarray:
mov dx,offset result
mov ah,09h
int 21h
cmp bh,1 ;检查最后计算是否有进位
jnz ptnext
mov ax,31h
push ax
ptnext: pop dx
cmp dx,0dh
jz exit
mov ah,02h
int 21h
jmp ptnext
exit: mov ah,4ch
int 21h
main endp
end main
评论