从键盘上键入2个10位数以内(位数可变)十进制值数,对其求和并显示结果,
程序运行时提示请输入加数和被加数,求完和显示结果后,显示继续和退出。
code segmentassume cs:code,ds:code
org 100h;标准COM格式
start:
mov ax,3;文本模式
int 10h
push cs
pop ds
push ds
pop es
Again:
lea dx,mes1;提示
mov ah,9
int 21h
mov di,30fh
call input;接收 数A
lea dx,mes2;提示
mov ah,9
int 21h
mov di,31fh
call input;接收 数B
call count;求和
lea dx,mes3
mov ah,9
int 21h
;*** 输出十进制的结果 ***
call crt
lea dx,mes4
mov ah,9
int 21h
mov ah,0;暂停
int 16h
cmp ah,15h ;"Y(y)"继续
jz Again;计算下一题
mov ah,4ch;结束
int 21h
input:
mov cx,10
T1:mov ah,0;接收数字
int 16h
cmp al,0dh
jz ok
cmp al,'0';数据校验
jb T1
cmp al,'9'
ja t1
yes:
mov ah,0eh ;显示有效数据
int 10h
w2:push ax ;压入堆栈
loop T1
ok:mov bp,cx
inc bp
mov cx,11
sub cx,bp
std
jcxz u3
u1:pop ax
stosb
loop u1
u3:mov al,'0'
mov cx,bp
u2:stosb
loop u2
ret
count:mov si,30fh
mov di,31fh
xor dx,dx;清进位
mov cx,11;改变此值,可实现超大数相加
T3: call subs_c;逐位累加
dec si
dec di
loop T3
ret
subs_c: ;[原创]多位加法核心子程序
mov al,[si];最低位对齐
mov ah,[di]
and ax,0f0fh
add al,ah;自加
add al,dl;加后面进位
aam;二化十
mov dl,ah;存进位位
or al,30h
mov [SI],al;保存1位和值,这里抄错了。
ret
crt:cld
xor bp,bp
mov si,305h
mov cx,10
cr3:
mov al,[si]
cmp al,'0'
jnz cr0
inc bp
inc si
loop cr3
cr0:
mov cx,11
sub cx,bp
mov si,305h
add si,bp
cr1:lodsb
mov ah,0eh
int 10h
loop cr1
ret
mes1 db 0dh,0ah,09,'Input A(0-9,999,999,999): $'
mes2 db 0dh,0ah,09,'Input B(0-9,999,999,999): $'
mes3 db 0dh,0ah,09,'Sum A+B= $'
mes4 db 0dh,0ah,09,'Continue Y(y)? $'
code ends
end start
温馨提示:答案为网友推荐,仅供参考