鱼C论坛

 找回密码
 立即注册
查看: 3330|回复: 13

监测点9.3的一个问题 就是那么一根筋没想通 求大神为我解开那跟筋

[复制链接]
发表于 2012-12-25 22:17:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
检测点9.3

补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。

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

为什么是INC CX   这不是多此一举吗?  求详解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-12-25 22:34:40 | 显示全部楼层
难道是书的答案有错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-26 01:33:56 | 显示全部楼层
你想想看,检测出0后,cl=0,此时inc cx,cx=1,那么在loop时,cx自减,此时cx=0,跳出loop,,如果不加cx的话,在loop处,cx会等于0ffffh,,那就不对了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2012-12-26 20:23:57 | 显示全部楼层

貌似不对吧   你看  CX加一后   那就说明循环一次  循环一次然后又到INC CX处  CX又加一  又循环  如此下去  这不是一直要循环到溢出?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-26 21:07:19 | 显示全部楼层
鲁哥学汇编 发表于 2012-12-26 20:23
貌似不对吧   你看  CX加一后   那就说明循环一次  循环一次然后又到INC CX处  CX又加一  又循环  如此下 ...

我感觉是你没有理解透loop指令的动作,3楼说的是对的。loop循环的判断依据是,首先CX自减1,自检结果如果为0,则跳出循环,否则循环继续。所以当mov cl,[bx]  mov ch,0执行完以后,如果这时候的CX为0,则恰恰要先自加1,才能正常退出loop。否则CX将自减为ffff,循环继续。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-27 04:48:35 | 显示全部楼层
本帖最后由 属専色灰 于 2012-12-27 04:52 编辑

这样够详细了吧!你在看不懂我跳楼了。自己下载好了

新建文本文档.zip

1.04 KB, 下载次数: 28

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2012-12-27 04:53:52 | 显示全部楼层
你看懂了这个,那么后面那个检测题也能够看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-12-27 20:03:20 | 显示全部楼层
属専色灰 发表于 2012-12-27 04:53
你看懂了这个,那么后面那个检测题也能够看懂

懂了   是我理解LOOP的涵义了   我认为的是只要CX不为零就要看里面的数循环       原来先将CX减一 在执行循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2015-10-17 22:56:08 | 显示全部楼层
assume cs:code   这里进行关联,常识吧

code segment   申请代码段
这里分第一个部分
start:  mov ax,2000h

        mov ds,ax   指定首地址

        mov bx,0    bx清零

      s:mov cl,[bx]   这里很好说,假如第一次循环,那么cl应该是0对不对   

        mov ch,0      在这里又把高位清零对不对

        inc cx        在这里我们+1

        inc bx         同理,加上1,为了第二次的循环

        loop s (cx-1然后决定怎么执行)     Loop指令是检测cx的值,为零才不循环对吧,那么说
                                          ,我们在这里的时候如果(cl不为零的话也就是我们
                                          想要的值没有得到,那么跳到标识处继续。这样来说
                                          只要[bx]不为0我们这里就会一直循环。
                    
  那么假如找到的话呢! cl的值就是0(bx传进来的)  然后又经过mov ch,0这句代码,这样我们得到的cx的值=0
  那么这句代码  inc cx 又干嘛呢!是多余吗?不是的,因为loop循环之前必须判断  cx减去1到底
  为不为零,才确定是否循环,所以呢!   inc cx(在找到的情况下)前面两句已经吧cx定义为零了
  那么如果这里不加这句代码的那么到了loop那里就会变成  cx(0)-1=-1,本来已经找到了,可是结果
  变成了这样,那么又会再次进入死循环,嘿嘿!那样又有什么意义呢!得到了结果却没办法跳出
  来传值,这样岂不是多做白用工吗?  那么加上了这句  那么到了loop那里就是  cx(1)-1=0,那么
  我们就可以跳出来了对不对。



  你明白了上面的,那么下面就不用我解释了吧

这里分第二个部分  
   ok:dec bx

        mov dx,bx

        mov ax,4c00h

        int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-18 21:18:01 | 显示全部楼层
多谢属専色灰等各位童鞋支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-18 22:43:27 | 显示全部楼层
关键是:在loop时,cx自减。终于弄明白了。再次感谢各位童鞋的帮助:smile:smile:smile:smile:smile
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-24 02:08:44 From FishC Mobile | 显示全部楼层
loop指令执行时,首先是cx=cx—1 然后才判断cx是否等于0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-4 11:08:26 | 显示全部楼层
看来我也懂额了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-17 15:46:10 | 显示全部楼层
九楼的解释最好,最精彩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表