data segment
firstNum db bufflen,0,bufflen dup(?)
SecondNum db bufflen,0,bufflen dup(?)
result db bufflen dup(?),24h
prompt db "please input the first number:",24h
prompt2 db "please input the second number:",24h
data ends
code segment
assume cs:code,ds:data,es:data
start:
mov ax,data
mov ds,ax
mov es,ax
mov ah,9
lea dx,prompt
int 21h
lea dx,FirstNum
call GetNum
mov ah,9
lea dx,prompt2
int 21h
lea dx,SecondNum
call GetNum
lea si,FirstNum
inc si
inc si
lea di,SecondNum
inc di
inc di
lea bx,result
mov cx,maxlen
call addition
lea dx,result
call dispnum
mov ah,4ch
int 21h
;接收一个十进制数字串,且扩展成30位
;入口参数:dx=存放数字串的缓冲区起始地址
getnum proc
mov ah,0aH
int 21h
mov dl,0dh ;回车
mov ah,2
int 21h
mov dl,0ah ;换行
mov ah,2
int 21h
mov si,dx
inc si
mov cl,[si] ;取输入的数字串长度
xor ch,ch
mov ax,maxlen
std
mov di,si
add di,ax
add si,cx
sub ax,cx
rep movsb ;数字串向高地址移,让出低地址
mov cx,ax
jcxz getnum1
xor al,al
rep stosb
getnum1:cld
ret
getnum endp
;入口参数:SI=被加数的开始地址
;入口参数:DI=加数的开始地址
;入口参数:CX= 串长度
;入口参数:BX=存放结果的缓冲区开始地址
addition proc
std
add bx,cx ;BX指向结果缓冲区最后一个字节
add si,cx
add di,cx
dec si ;si指向被加数缓冲区最后一个字节
dec di ;di指向加数缓冲区最后一个字节
xchg di,bx
inc bx
clc
add1: dec bx
lodsb
adc al,[bx]
aaa
stosb
loop add1
mov al,0
adc al,0
stosb
cld
ret
addition endp
;显示结果
;入口参数:DX=结果的缓冲区开始地址
dispnum proc
mov di,dx
mov al,0
mov cx,maxlen
repz scasb
dec di
mov dx,di
mov si,di
inc cx
disp1: lodsb
add al,30h
stosb
loop disp1
mov ah,9
int 21h
ret
dispnum endp
code ends
end start