监测点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 这不是多此一举吗?求详解 难道是书的答案有错? 你想想看,检测出0后,cl=0,此时inc cx,cx=1,那么在loop时,cx自减,此时cx=0,跳出loop,,如果不加cx的话,在loop处,cx会等于0ffffh,,那就不对了 张国祥 发表于 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 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:52 编辑
这样够详细了吧!你在看不懂我跳楼了。自己下载好了
你看懂了这个,那么后面那个检测题也能够看懂 属専色灰 发表于 2012-12-27 04:53 static/image/common/back.gif
你看懂了这个,那么后面那个检测题也能够看懂
懂了 是我理解LOOP的涵义了 我认为的是只要CX不为零就要看里面的数循环 原来先将CX减一 在执行循环 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 多谢属専色灰等各位童鞋支持 关键是:在loop时,cx自减。终于弄明白了。再次感谢各位童鞋的帮助:smile:smile:smile:smile:smile loop指令执行时,首先是cx=cx—1 然后才判断cx是否等于0 看来我也懂额了 九楼的解释最好,最精彩
页:
[1]