鱼C论坛

 找回密码
 立即注册
查看: 3923|回复: 4

难道它陷入了死循环?????

[复制链接]
发表于 2011-9-27 11:31:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gongheng 于 2011-9-27 11:43 编辑

今天照着小甲鱼老师的视频写了段代码,但是运行后老卡在循环退出之前,难道是死循环???还是我电脑的问题???
大家帮忙看看!!!
下面是debug和源程序:
=========================================================
(C)Copyright Microsoft Corp 1990-2001.

C:\>cd masm615

C:\MASM615>debug s8.exe
-r
AX=0000  BX=0000  CX=0062  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0D47  ES=0D47  SS=0D57  CS=0D5B  IP=0000   NV UP EI PL NZ NA PO NC
0D5B:0000 B8570D        MOV     AX,0D57
-u 0d5b:0
0D5B:0000 B8570D        MOV     AX,0D57
0D5B:0003 8ED8          MOV     DS,AX
0D5B:0005 BB0000        MOV     BX,0000
0D5B:0008 B90400        MOV     CX,0004
0D5B:000B BE0000        MOV     SI,0000
0D5B:000E B90300        MOV     CX,0003
0D5B:0011 8A00          MOV     AL,[BX+SI]
0D5B:0013 24DF          AND     AL,DF
0D5B:0015 46            INC     SI
0D5B:0016 E2F9          LOOP    0011
0D5B:0018 83C310        ADD     BX,+10
0D5B:001B E2EE          LOOP    000B
0D5B:001D B8004C        MOV     AX,4C00
-g 001d

到这里就不往下走了
========================================================
源程序:
assume cs:code,ds:data
data segment
        db'ibm             '
        db'dec             '
        db'dos             '
        db'vax             '
        data ends
        
code segment
start:        mov ax,data
        mov ds,ax
        mov bx,0
        mov cx,4
s0:        mov si,0
        mov cx,3
        
s:        mov al,[bx+si]
        and al,11011111b
        inc si
        loop s
        
        add bx,16
        loop s0

        mov ax,4c00h
        int 21h
code ends
end start
=============================================================
这是运行前的数据段内存情况:        
;0D57:0000  69 62 6D 20 20 20 20 20-20 20 20 20 20 20 20 20   ibm
;0D57:0010  64 65 63 20 20 20 20 20-20 20 20 20 20 20 20 20   dec
;0D57:0020  64 6F 73 20 20 20 20 20-20 20 20 20 20 20 20 20   dos
;0D57:0030  76 61 78 20 20 20 20 20-20 20 20 20 20 20 20 20   vax





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-27 11:39:38 | 显示全部楼层
晕,我看完了那集视频,原来它真是个死循环!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-27 15:21:31 | 显示全部楼层
我怎么没有陷入死循环啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-27 16:20:22 | 显示全部楼层
当然会是死循环了,你的内循环没有问题;可因为你外循环的次数cx的原值已经在进入内循环时候被破坏了;每次内循环loop s结束时候,cx=0,那么跳出内循环,接着loop s0,cx=ffffh;永远都不会为0,从而跳至外循环s0,又都会重置cx=3;你这儿内循环是可终止的,而外循环是死循环。
所以在进入内循环之前要保护外循环的cx值,可用栈也可以用寄存器暂存。用栈如下:     ...
      mov cx,4
s0:   push cx     ;暂存
        mov si,0
        mov cx,3
        
s:        mov al,[bx+si]
        and al,11011111b
        inc si
        loop s
        
        add bx,16
       pop cx     ;取出外循环次数
        loop s0





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-27 19:41:15 | 显示全部楼层
恩,就是需要吧,外层循环cx的值临时保存下,小甲鱼老师最后是用栈来做临时保存的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 22:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表