难道它陷入了死循环?????
本帖最后由 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
晕,我看完了那集视频,原来它真是个死循环!!!!! 我怎么没有陷入死循环啊 当然会是死循环了,你的内循环没有问题;可因为你外循环的次数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
恩,就是需要吧,外层循环cx的值临时保存下,小甲鱼老师最后是用栈来做临时保存的。
页:
[1]