为什么0-65535可以,65536-99999就不行???
一个将输入的5位十进制数以二进制BCD码显示出来的程序。
我编的程序如下:
data segment
mess1 db 'Input number:$'
mess2 db 'Its BCD code is $'
number db 6,?,6 dup(?)
data ends
stack segment
dw 20 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
again:lea dx,mess1
mov ah,09h
int 21h
lea dx,number
mov ah,0ah
int 21h
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h ;回车换行
;省略了中间应该没错的部分,这时已经让(dx,ax)=输入的数的值了。如输入99999时(dx,ax)=0001869fH
d: mov bx,2 ;bx中放除数2
c: div bx
push dx
inc cx ;cx用于保存以后出栈的次数,此前已经有(cx)=0
cwd ;将ax中的字扩展为dx,ax中的双字
cmp ax,0
jne c
lea dx,mess2
mov ah,09h
int 21h
mov ah,02h
disp: pop dx
add dx,30h
int 21h
loop disp
;若在此处加上jmp again则生成的执行文件执行时会弹出警告窗口:
C:\WINNT\SYSTEM32\CMD.EXE -9 NTVDM CPU遇到无效的指令。CS:056f IP:0026 OP:f0
d0 fb dc e6 选择关闭终止应用程序。
mov ax,4c00h
int 21h
code ends
end start
请问大侠:
1.该程序生成的执行文件对0——65535之间的数均能正确得出结果。但从
65536——99999却显示Divide overflow。这是何故?要如何改正?
2.在上述处加上jmp again出现的是什么错误?如果要再让你输入数重新得出结果,要
怎么改?
///////////////////////////////////////
附完整程序:
data segment
mess1 db 'Input number:$'
mess2 db 'Its BCD code is $'
number db 6,?,6 dup(?)
data ends
stack segment
dw 20 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea dx,mess1
mov ah,09h
int 21h
lea dx,number
mov ah,0ah
int 21h
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
lea si,number+1
mov cx,[si]
a: inc si
sub byte ptr [si],30h
loop a ;将每一位以ASCII码输入的数(其实是字符)转换成二进制数
mov al,number[1]
cbw
mov cx,ax ;(cx)=输入的数的位数
lea si,number+2
mov al,[si]
mov ah,0
mov dx,0
dec cx ;此时的(cx)方为要乘以10的次数
cmp cx,0
je d ;(cx)=0,即输入的是一位数,不用乘以10
mov bx,10
b: mul bx
inc si
add al,[si]
adc ah,0
adc dx,0
loop b
d: mov bx,2 ;bx中放除数2
c: div bx
push dx
inc cx ;cx用于保存以后出栈的次数,此前(cx)=0
cwd ;将ax中的字扩展为dx,ax中的双字
cmp ax,0
jne c
lea dx,mess2
mov ah,09h
int 21h
mov ah,02h
disp: pop dx
add dx,30h
int 21h
loop disp
mov ax,4c00h
int 21h
code ends
end start