主要有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