注册 登录
编程论坛 汇编论坛

初学CX,没设置CX,它是如何能循环的呢,

luohua2007 发布于 2007-05-23 14:21, 4329 次点击

补全程序,利用loop指令,实现在内存2000H段中查找第一个值为0的byte,找到后,将它的偏移地址存储在dx中。
问题:一直看不明白这个程序,没有设置CX,它LOOP S如何循环呢,难道说用INC CX做循环条件吗,可这样的话,CX老是等于1,又如何执行下面OK中的程序,请大家指点一下把,没见过没有CX还能循环的例子

assume cs:code
code segment
start:
mov ax,2000h
mov ds,ax
mov bx,0
s:
mov cl,[bx]
mov ch,0
inc cx ;此条指令为题目要求补全的指令//
inc bx
loop s
ok: dec bx
mov dx,bx
mov ax,4c00h
int 21h
code ends
end start

10 回复
#2
菜鸟上路2007-05-23 17:28
inc cx是保证至少能循环一次。
先讲下LOOP好了,LOOP是先把CX的值减1,然后再和0比较,如果不等于0,接着循环,如果等于0,就退出循环
假设[bx]中是0,如果没inc cx,那么loop s之后,cx就变成-1了,再也无法等于0了,以后就会一直循环下去。
#3
guancracker2007-05-23 21:10

问题:一直看不明白这个程序,没有设置CX,它LOOP S如何循环呢,难道说用INC CX做循环条件吗,可这样的话,CX老是等于1,又如何执行下面OK中的程序,请大家指点一下把,没见过没有CX还能循环的例子


cx 不是设置了吗?
mov cl,[bx]
mov ch,0 //这里 CX 不是等于0吗? 它分高,低8位存的嘛。

#4
luohua20072007-05-23 21:16

知道拉,忽然明白了,谢谢斑竹了,原来如此

#5
luohua20072007-05-24 10:49
[QUOTE]cx 不是设置了吗?
mov cl,[bx]
mov ch,0 //这里 CX 不是等于0吗? 它分高,低8位存的嘛。[/QUOTE]

想了一夜,在想想,又不明白了,假设现在
mov cl,[bx]//{BX]=0了
mov ch 0 //也就是说已经找到值为0的byte了,CH是高8位0,CL是低8位0,按理说该结束循环了才对
inc cx //可到了这句,岂不是又把[BX]已经找到值为0的byte加1了吗,CX又等于了1,那么下 一句LOOP S又要循环,无休无止,还 是说如果[BX]等于0了后,它就是等于0了,不在加1了,那么就可以结束循环了
LOOP S
#6
菜鸟上路2007-05-24 11:01
LZ在仔细想想吧
分别对两个程序用debug调试下,看执行的指令是什么
#7
Pants2007-05-24 18:08
答5楼问题

仔细领悟LOOP命令执行过程。
LOOP的执行过程是先使cx-1,然后判断cx是否为0,如果为0,就不跳到标号处了。

再回到题目,为什么要 inc cx 呢?
因为如果不 inc cx ,那么找到为0的值后,接着loop,那么cx的值就会变成FFFFh,也就不会跳出循环了。
#8
guancracker2007-05-24 18:50
以下是引用luohua2007在2007-5-24 10:49:54的发言:
cx 不是设置了吗?
mov cl,[bx]
mov ch,0 //这里 CX 不是等于0吗? 它分高,低8位存的嘛。


想了一夜,在想想,又不明白了,假设现在
mov cl,[bx]//{BX]=0了
mov ch 0 //也就是说已经找到值为0的byte了,CH是高8位0,CL是低8位0,按理说该结束循环了才对
inc cx //可到了这句,岂不是又把[BX]已经找到值为0的byte加1了吗,CX又等于了1,那么下 一句LOOP S又要循环,无休无止,还 是说如果[BX]等于0了后,它就是等于0了,不在加1了,那么就可以结束循环了
LOOP S

你没理解好 LOOP ,还有 内存单元是从0开始计的。

#9
luohua20072007-05-25 00:05
抱歉一下,是我没学仔细看好LOOP的用法,其实汇编都看了第4遍了,现在又从头开始了我的记忆力
#10
guancracker2007-05-25 00:51
假设现在 {BX]=0了 (就是找到了第一个值为0的单元)
mov cl,[bx]
mov ch,0 ; 这时CX 为0
inc cx ;CX为1
inc bx
loop s ;你就错在这里。。。。。 这时执行 loop S ,CX先减1 ,( 这里也就是1-1 ),
再判断循不循环 (因为1-1=0,所以不循环了);向下执行。
上面几位仁兄说得很清楚了。 简单的说就是执行loop S ,CX先减1
减完1后再用这个CX值 判断循不循环

如果这样说了你还模糊,不怪你。是我表达不好。
#11
luohua20072007-05-25 12:42

现在明白了,完全明白了,是我没理解好LOOP的用法,
现在感觉好多了,让大家费心了
非常感谢

1