| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4316 人关注过本帖, 1 人收藏
标题:初学CX,没设置CX,它是如何能循环的呢,
只看楼主 加入收藏
luohua2007
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2007-4-11
收藏(1)
 问题点数:0 回复次数:10 
初学CX,没设置CX,它是如何能循环的呢,

补全程序,利用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

搜索更多相关主题的帖子: 初学 
2007-05-23 14:21
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
inc cx是保证至少能循环一次。
先讲下LOOP好了,LOOP是先把CX的值减1,然后再和0比较,如果不等于0,接着循环,如果等于0,就退出循环
假设[bx]中是0,如果没inc cx,那么loop s之后,cx就变成-1了,再也无法等于0了,以后就会一直循环下去。

2007-05-23 17:28
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
收藏
得分:0 

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


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


2007-05-23 21:10
luohua2007
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2007-4-11
收藏
得分:0 

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


来生 再续前缘 孟婆浅浅一笑 低头看那一锅普通的汤 只因加了一味叫遗忘的草料 也抵过了曾经的万千誓言
2007-05-23 21:16
luohua2007
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2007-4-11
收藏
得分:0 
[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

来生 再续前缘 孟婆浅浅一笑 低头看那一锅普通的汤 只因加了一味叫遗忘的草料 也抵过了曾经的万千誓言
2007-05-24 10:49
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
LZ在仔细想想吧
分别对两个程序用debug调试下,看执行的指令是什么

2007-05-24 11:01
Pants
Rank: 1
等 级:新手上路
威 望:1
帖 子:49
专家分:0
注 册:2007-5-21
收藏
得分:0 
答5楼问题

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

再回到题目,为什么要 inc cx 呢?
因为如果不 inc cx ,那么找到为0的值后,接着loop,那么cx的值就会变成FFFFh,也就不会跳出循环了。

宁以修身 静以养性
2007-05-24 18:08
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
收藏
得分:0 
以下是引用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开始计的。


2007-05-24 18:50
luohua2007
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2007-4-11
收藏
得分:0 
抱歉一下,是我没学仔细看好LOOP的用法,其实汇编都看了第4遍了,现在又从头开始了我的记忆力

来生 再续前缘 孟婆浅浅一笑 低头看那一锅普通的汤 只因加了一味叫遗忘的草料 也抵过了曾经的万千誓言
2007-05-25 00:05
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
收藏
得分:0 
假设现在 {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值 判断循不循环

如果这样说了你还模糊,不怪你。是我表达不好。

2007-05-25 00:51
快速回复:初学CX,没设置CX,它是如何能循环的呢,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024704 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved