任意两个10位以内十六进制数求和并显示
汇编语言程序设计题
http://zhidao.baidu.com/question/129269410.html
悬赏分:200 - 离问题结束还有 20 天 9 小时
题目如下:从键盘上输入2个10位数以内(位数可变)十六进制数,
对其求和并显示结果,程序运行时提示输入加数和被加数,
求完和显示结果后,显示继续和退出。 非常谢谢!
问题补充:和数仍以十六进制形式显示输出。
提问者: 匿名
说明:这是百度汇编吧_任意两个10位以内十六进制数求和
http://tieba.baidu.com/f?kz=681706003
的修改版,添加了无输入处理和清除前导空格指令.
code segment;任意两个10位以内十六进制数求和
assume 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'
jbe yes
and al,1011111b ;字母转为大写
t2:cmp al,'A'
jb t1
cmp al,'F'
ja t1
yes:
mov ah,0eh ;显示有效数据
int 10h
sub al,30h
cmp al,9
jbe w2
sub al,7
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
mov ah,0
mov cx,11
T3: mov al,[si]
add al,[di]
add al,ah
call part
dec si
dec di
loop T3
ret
part:
push cx
mov cl,4
mov ah,al
and al,0fh
shr ah,cl
or al,30h
cmp al,'9'
jbe pa1
add al,7
pa1:mov [si],al;逐位累加
pop cx
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
mov al,'H'
int 10h
ret
mes1 db 0dh,0ah,09,'Input number A: $'
mes2 db 0dh,0ah,09,'Input number B: $'
mes3 db 0dh,0ah,09,'Sum A+B= $'
mes4 db 0dh,0ah,09,'Continue Y(y)? $'
code ends
end start