data segment
one db 6 ;最大宽度(包括回车符)
db ? ;保存实际宽度
db 6 dup(?) ;实际内容
two db 6
db ?
db 6 dup(?)
mess1 db 'please enter the first one:','$' ;显示提示信息
mess2 db 'please enter the second one:','$'
mess3 db 'the result of add:','$'
mess4 db 'the one actual number:','$'
data ends
code segment
assume cs:code,ds:data ;cs:代码段寄存器
start:
mov ax,data ;立即数不能直接存放段寄存器
mov ds,ax ;存放段地址
mov dx,offset mess1 ;偏移地址
mov ah,09h
int 21h ;输出字符串
inone: mov dx,offset one
mov ah,0ah
int 21h ;输入第一个数
mov si,offset one+2 ;存放实际输入第一个数的首地址,si:指针寄存器
mov cl,one+1 ;存放实际宽度
mov ch,0 ;高位清零
mov di,0 ;di:指针寄存器
mov bx,10 ;每次乘10
ston1: ;字符串转数字(String to number)
mov al,[si] ;直接寻址
sub al,30h ;字符串保存的是ASSIC码
mov ah,0
xchg di,ax ;与之前的数字交换
mul bx ;累乘
add di,ax
inc si ;实际数地址累加
dec cx ;实际宽度累减
cmp cx,0 ;判断是否输出完
jnz ston1 ;结果不相等,跳转
mov dl,0ah
mov ah,02h
int 21h ;换行
mov dx,offset mess2
mov ah,09h
int 21h ;输出字符串
mov dx,offset two
mov ah,0ah
int 21h ;输入第二个数
mov si,offset two+2
mov cl,one+1
mov bp,0 ;bp:指针寄存器
mov bx,10
ston2:
mov al,[si]
sub al,30h
mov ah,0
xchg bp,ax
mul bx
add bp,ax
inc si
dec cx
cmp cx,0
jnz ston2
mov dl,0ah
mov ah,02h
int 21h ;换行
mov dx,offset mess3
mov ah,09h
int 21h ;显示字符串
mov ax,di
add ax,bp ;两数相加
mov dx,0 ;准备ax,dx
mov bx,10000
div bx ;(dx,ax)/src,商->ax,余->dx
mov cx,dx ;保护余数
mov dl,al
add dl,30h ;转化为数字
mov ah,02h
int 21h ;显示万位
mov ax,cx
mov dx,0
mov bx,1000
div bx
mov cx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
mov ax,cx
mov dx,0
mov bx,100
div bx
mov cx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
mov ax,cx
mov dx,0
mov bx,10
div bx
mov cx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
mov ax,cx
mov dl,al
add dl,30h
mov ah,02h
int 21h
mov dl,0Ah
mov ah,02h
int 21h
mov dx,offset mess4
mov ah,09h
int 21h
mov dl,one+1
add dl,30h
mov ah,02h
int 21h ;显示实际个数
mov ah,4ch
int 21h ;结束程序
code ends ;结束代码段
end start