为什么进入死循环了

gxlzh88 2009-06-15 10:23:36
一个从键盘接受1个四位的16制数,并在终端上显示与其等值的二进制的程序,陷入了死循环了,各位高手看下,在那里出错了,谢谢啦
data segment
tmp db 4 dup (?)
data ends
code segment
main proc far
assume cs:code, ds:data
start:
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov si,0
mov cx,4

input: ;;输入并存在tmp中
mov ah,01h
int 21h
mov tmp[si],al
inc si
loop input

mov si,0
mov dl,3dh
mov ah,02h
int 21h
;;;;;;;;;;;;;

;;;;;;;;;;
mov cx,4
output:;;假设输入全是合法的,进行转换并输出
mov bl,0
mov al,tmp[si]
inc si
sub al,30h
cmp al,10
jl pri
sub al,7

pri: ;把一个16进制的数按二进制输出
inc bl
cmp bl,5
jz output
test al,01h
jz oup1
jmp oup0

oup1:
ror al,1
mov dl,31h
mov ah,02h
int 21h
jmp pri

oup0:
ror al,1
mov dl,30h
mov ah,02h
int 21h
jmp pri

;;;;;;;;;;

loop output
ret
main endp
code ends
end start
...全文
67 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxlzh88 2009-06-17
  • 打赏
  • 举报
回复
哦,谢谢你的热心帮助啦,不过好像你对我的程序有点错解了,我的思路是,先把1位十六进制数取出,再通过循环四次来把它转换成二进制的,也就是说我的程序里面是循环里面包含有循环的,换你的改法,就程序无法得到正确结果了。不过我从你的改法中也终于知道我的错误在那里了:语句永远无法执行到loop output这个,程序就无法结束外面那个循环。所以,可以在output的开始位置加入jmp,来强行执行,也可以换种方法来进行循环.不过还是谢谢你的热心
pla_007 2009-06-15
  • 打赏
  • 举报
回复

oup1:
ror al,1
mov dl,31h
mov ah,02h
int 21h
jmp pri ;执行到此处,会强制回到pri处

oup0:
ror al,1
mov dl,30h
mov ah,02h
int 21h
jmp pri ;执行到此处,会强制回到pri处

;;;;;;;;;;

loop output
ret
main endp
code ends
end start



将其改为:


oup1:
ror al,1
PUSH AX ;;;;;
mov dl,31h
mov ah,02h
int 21h
POP AX ;;;;
jmp print_end ;pri

oup0:
ror al,1
PUSH AX ;;;;;
mov dl,30h
mov ah,02h
int 21h
POP AX ;;;;
jmp print_end ;pri

;;;;;;;;;;
print_end:
loop output



这样的话,可以不陷入死循环了。
不过你的程序流程有问题。1位的16进制数,应该用4位的2进制0、1表示。
所以1个4位的16制数,应该有4*4 = 16 位的2进制0、1表示。

流程想清楚了,再把原来的程序稍微改一改,相信你会很快实现你要的功能。


PS:看你的帖很爽,知道这是自己用心去学的,而不像有的人问作业帖,一上来就直接要求别人帮他做。
加油!

21,500

社区成员

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

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