| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1522 人关注过本帖
标题:为什么最后一次没有循环?CX=1的时候直接跳出循环了
只看楼主 加入收藏
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
结帖率:71.43%
收藏
已结贴  问题点数:20 回复次数:9 
为什么最后一次没有循环?CX=1的时候直接跳出循环了
程序代码:
assume cs:code,ds:data
data segment
    db 32 dup(0)
data ends
code segment
    start:   
                mov ax,data
                mov ds,ax
                mov si,0
                mov ax,1266;1266处理结果应该是把‘6621’写到data区域的
                mov bl,10
                mov ch,0
        s0:
            div bl
            add ah,30h
            mov ds:[si],ah ;把余数转成相应字符写到data区域
            mov ah,0
            mov cl,al
            jcxz ok   ;这里不知为什么CX=1的时候就直接跳到mov ax,4c00h了
            inc si
            mov ah,0
            loop s0
         ok:
                    
                 mov ax,4c00h;跳到这一步后 用D DS:0 8只能看到662,看来最后一位余数没有处理
                 int 21h
                
   
code ends
end start

这是王爽老师书上的 实验10第3题 数值显示的一部分,把数字以十进制形式的字符串写到data区。比如数字1234,就把字符串‘4321’写到data区域。以后颠倒前后顺序即可。
对每个要处理的数字,只需要循环除以10,提取商和余数,把余数加上30H,就可以转换成对应的字符。当商为0时循环结束。
我的这个问题是,最后一位余数没有处理,比如1234,只能在data区域写入432。我用debug跟踪的时候发现,CX=1的时候,jcxz就跳转了。这是为什么呢?
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: color 
2012-10-21 19:08
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
循环指令(Loop Until Complete)

循环指令LOOP的一般格式:

LOOP 标号
LOOPW 标号      ;CX作为循环计数器,80386+
LOOPD 标号      ;ECX作为循环计数器,80386+

循环指令的功能描述:
 

图5.12 循环指令LOOP的功能示意图
 
 (CX)=(CX)-1或(ECX)=(ECX)-1;
 如果(CX)≠0或(ECX)≠0,转向“标号”所指向的指令,否则,终止循环,执行该指令下面的指令。


LOOP的功能是 减1 判断 如果不是0 则跳

为啥是这样的呢 比如你赋CX为5 那么

a:
……
loop a

这一段中 每次执行loop前cx依次为5 4 3 2 1 最后一次cx是1 然后就不会循环了

这样设计才能和cx表示循环次数一致

我说的够详细了 如果再不明白 看书去罢
2012-10-21 19:44
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3452
专家分:19340
注 册:2012-3-31
收藏
得分:0 
学习

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-10-21 19:45
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用青春无限在2012-10-21 19:45:40的发言:

学习

你们这样学习来学习去的蹭分我感觉压力很大啊
2012-10-21 19:48
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:10 
做为loop循环 在整个循环外必须明确循环次数 而你的s0循环外只有个mov ch, 0
那么你吧循环的CX值完全寄托在LOOP循环里面的mov cl, al 上 这个怎么行? 当你要处理的数字
的最高位是1的时候就会把这个最高位丢弃的
你应该吧Loop s0 改为jmp s0. 很显然跳出jmp的指令是 jcxz ok. 这时所有的位置都除完了 也处理完了
最后的商是0  CX就被赋予0值 从而结束循环。

梅尚程荀
马谭杨奚







                                                       
2012-10-21 20:37
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
收藏
得分:0 
回复 5楼 有容就大
谢谢回答,看来我操之过急了。我再回去看看
2012-10-21 20:54
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
收藏
得分:0 
回复 2楼 zklhp
我一直在检查jcxz,原来是loops的问题。
2012-10-21 20:56
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用chaoc在2012-10-21 20:54:09的发言:

谢谢回答,看来我操之过急了。我再回去看看

初学就知道用debug来调试汇编程序的 一般都能比较顺利的学好汇编 而且王爽的书不是很难 祝楼主成功。

梅尚程荀
马谭杨奚







                                                       
2012-10-21 20:58
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
收藏
得分:0 
回复 8楼 有容就大
谢谢!两位版主大大。果然很热心啊!

顺便问一下,有什么好的8086的汇编编辑器推荐吗?代码没高亮显示,有点不习惯。我按照网上的教程配置了UE编辑器,可是不成功。也许是没破解。
2012-10-21 21:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用chaoc在2012-10-21 21:07:13的发言:

谢谢!两位版主大大。果然很热心啊!

顺便问一下,有什么好的8086的汇编编辑器推荐吗?代码没高亮显示,有点不习惯。我按照网上的教程配置了UE编辑器,可是不成功。也许是没破解。

MASMPlus 或者 Notepad++ 或者 Randsam 或者 (不敢说了 那些都是神器)。。。太多了 可以搜搜看有没自己喜欢的

梅尚程荀
马谭杨奚







                                                       
2012-10-21 22:26
快速回复:为什么最后一次没有循环?CX=1的时候直接跳出循环了
数据加载中...
 
   



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

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