鲁哥学汇编 发表于 2012-12-25 22:17:58

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

检测点9.3

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

assume cs:code

code segment

start:mov ax,2000h

      mov ds,ax

      mov bx,0

      s:mov cl,

      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   这不是多此一举吗?求详解

鲁哥学汇编 发表于 2012-12-25 22:34:40

难道是书的答案有错?

张国祥 发表于 2012-12-26 01:33:56

你想想看,检测出0后,cl=0,此时inc cx,cx=1,那么在loop时,cx自减,此时cx=0,跳出loop,,如果不加cx的话,在loop处,cx会等于0ffffh,,那就不对了

鲁哥学汇编 发表于 2012-12-26 20:23:57

张国祥 发表于 2012-12-26 01:33 static/image/common/back.gif
你想想看,检测出0后,cl=0,此时inc cx,cx=1,那么在loop时,cx自减,此时cx=0,跳出loop,,如果不加cx的 ...

貌似不对吧   你看CX加一后   那就说明循环一次循环一次然后又到INC CX处CX又加一又循环如此下去这不是一直要循环到溢出?

阿飞-祁磊 发表于 2012-12-26 21:07:19

鲁哥学汇编 发表于 2012-12-26 20:23 static/image/common/back.gif
貌似不对吧   你看CX加一后   那就说明循环一次循环一次然后又到INC CX处CX又加一又循环如此下 ...

我感觉是你没有理解透loop指令的动作,3楼说的是对的。loop循环的判断依据是,首先CX自减1,自检结果如果为0,则跳出循环,否则循环继续。所以当mov cl,mov ch,0执行完以后,如果这时候的CX为0,则恰恰要先自加1,才能正常退出loop。否则CX将自减为ffff,循环继续。

属専色灰 发表于 2012-12-27 04:48:35

本帖最后由 属専色灰 于 2012-12-27 04:52 编辑

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

属専色灰 发表于 2012-12-27 04:53:52

你看懂了这个,那么后面那个检测题也能够看懂

鲁哥学汇编 发表于 2012-12-27 20:03:20

属専色灰 发表于 2012-12-27 04:53 static/image/common/back.gif
你看懂了这个,那么后面那个检测题也能够看懂

懂了   是我理解LOOP的涵义了   我认为的是只要CX不为零就要看里面的数循环       原来先将CX减一 在执行循环

Alex158cao 发表于 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,   这里很好说,假如第一次循环,那么cl应该是0对不对   

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

      inc cx      在这里我们+1

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

      loop s (cx-1然后决定怎么执行)   Loop指令是检测cx的值,为零才不循环对吧,那么说
                                          ,我们在这里的时候如果(cl不为零的话也就是我们
                                          想要的值没有得到,那么跳到标识处继续。这样来说
                                          只要不为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

hexiaofengye 发表于 2015-10-18 21:18:01

多谢属専色灰等各位童鞋支持

hexiaofengye 发表于 2015-10-18 22:43:27

关键是:在loop时,cx自减。终于弄明白了。再次感谢各位童鞋的帮助:smile:smile:smile:smile:smile

xin8111992 发表于 2015-11-24 02:08:44

loop指令执行时,首先是cx=cx—1 然后才判断cx是否等于0

鱼C工作室.YCGZS 发表于 2015-12-4 11:08:26

看来我也懂额了

燕子湖畔 发表于 2016-3-17 15:46:10

九楼的解释最好,最精彩
页: [1]
查看完整版本: 监测点9.3的一个问题 就是那么一根筋没想通 求大神为我解开那跟筋