当前位置: 代码迷 >> 汇编语言 >> 键盘输入两个数,并计算和再输出!请各位帮忙看看,该怎么处理
  详细解决方案

键盘输入两个数,并计算和再输出!请各位帮忙看看,该怎么处理

热度:5236   发布时间:2013-02-26 00:00:00.0
键盘输入两个数,并计算和再输出!请各位帮忙看看
主要有immediate   mode   illegal
symbol   not   defined
错误
本人是菜鸟实在不知道怎么修改了!
我的分也少的可怜只能把我最后的一点给大家了!
data segment
buf1 db 3,?,3   dup(?)
buf2 db 3,?,3   dup(?)
num1 =0
num2 =0
data ends

code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset   buf1
mov ah,0ah
int 21h
mov ax,bx
mov num1,ax
call convert
call display
mov dx,offset buf2
mov ah,0ah
int 21h
mov ax,bx
mov   num2,ax
call convert
call display
sub bl,bl
add bx,num1
add bx,num2 ;bx   is   the   temporarily   result
mov ax,bx ;bx   is   sended   to   ax
call shift
mov ah,4ch
int 21h
code ends
end start

convert proc ;convert   the   data   of   buffer   to   the   number
mov cx,0
mov ax,0
mov bx,0
mov cl,3
return:
dec cl
mov al,[dx]
sub al,30h
jcxz adding
mul 10 ;the   sum   send   into   ax
adding:
add bx,ax ;result   send   into   bx
jcxz end
inc dx
jmp return
end:
ret
convert endp

display   proc
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
ret
display endp

shift proc ;convert   the   result   and   output
mov bx,10
push bx
dis:
cmp ax,0
jz dis0
div bx ;al   is   quotient,ah   is   residue
add ah,30h
push ah
cbw
jmp dis
dis0:
pop ah
cmp ah,10
je stop
mov ah,dl
mov ah,2
int 21h
jmp dis0
stop:
ret
shift endp

------解决方案--------------------------------------------------------

; 马马虎虎地在原来的程序修改了下, 自己看看改动的地方, 就是 ;* 这样注释的地方

Data segment
buf1 db 4,?,4 dup(?) ;* 回车也占用一个空间的, 所以最多输入 3 位数值时, 需要定义 4个字节的空间
buf2 db 4,?,4 dup(?) ;*
num1 dw 0 ;* =0 ; num1/num2 需要进行存取操作, 所以应该定义为内存变量, 而不是常量
num2 dw 0 ;* =0
data ends

code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset buf1
mov ah,0ah
int 21h
call convert
mov ax,bx ;* ; convert 子程返回的值要先保存
mov num1,ax ;* ; 这两个指令可以合并为 mov num1, bx
call display
mov dx,offset buf2
mov ah,0ah
int 21h
call convert
mov ax,bx
mov num2,ax
call display
sub bl,bl ; ;bl=0
mov bx,num1 ;*
add bx,num2 ;bx is the temporarily result
mov ax,bx ; bx is sended to ax
call shift
mov ah,4ch
int 21h


convert proc ;convert the data of buffer to the number
mov cx,0
mov ax,0
mov bx,0
mov si, dx ;*+ 进入子程时, dx 指向整个缓冲区的开始
add si, 2 ;*+ si 指向实际输入的字符的开始
mov cl,byte ptr [si][-1] ;* 这个是实际输入的字符数, 直接使用 3 容错性差
mov dl, 10 ;*+ 对 mul 指令不能使用立即数的
return:
dec cl
mov al,[si] ;*[dx]
sub al,30h
xchg ax, bx ;* bx 保存的是前几位的内容, 所以要被 10 乘的是它, 而不是当前的数字位
; jcxz adding
mul dl ;the sum send into ax
adding:
add bx,ax ;result send into bx