gongheng 发表于 2011-9-27 11:31:42

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

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

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

C:\>cd masm615

C:\MASM615>debug s8.exe
-r
AX=0000BX=0000CX=0062DX=0000SP=0000BP=0000SI=0000DI=0000
DS=0D47ES=0D47SS=0D57CS=0D5BIP=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,
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,
      and al,11011111b
      inc si
      loop s
      
      add bx,16
      loop s0

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





gongheng 发表于 2011-9-27 11:39:38

晕,我看完了那集视频,原来它真是个死循环!!!!!

seuer126 发表于 2011-9-27 15:21:31

我怎么没有陷入死循环啊

tsembrace 发表于 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,
      and al,11011111b
      inc si
      loop s
      
      add bx,16
       pop cx   ;取出外循环次数
      loop s0





gongheng 发表于 2011-9-27 19:41:15

恩,就是需要吧,外层循环cx的值临时保存下,小甲鱼老师最后是用栈来做临时保存的。
页: [1]
查看完整版本: 难道它陷入了死循环?????