为什么0-65535可以,65536-99999就不行???

jsjwql 2004-01-02 02:56:54
一个将输入的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

...全文
146 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdsjkk 2004-01-02
  • 打赏
  • 举报
回复
cwd是代符号扩展,
如果ax>=8000h,表示是负数,dx即被扩展为0ffffh
jsjwql 2004-01-02
  • 打赏
  • 举报
回复
csdsjkk() ( ) 兄的方法好
本身在内存中就是以二进制存放的,可以通过移位获得数据,好啊!!
我的程序重要是出错在哪
是不是在为扩展上,cbw ?cwd?
fancy0001 2004-01-02
  • 打赏
  • 举报
回复
你读入数据的代码考虑超过16bits的情况不对!
csdsjkk 2004-01-02
  • 打赏
  • 举报
回复
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,0 ; mov bx,2 ;bx中放除数2
cc: shr dx,1 ; div bx
rcr ax,1
adc bx,0
push bx
inc cx ;cx用于保存以后出栈的次数,此前(cx)=0
;cwd ;将ax中的字扩展为dx,ax中的双字
mov bx,ax
or bx,dx
;cmp ax,0
jne d

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


21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧