鱼C论坛

 找回密码
 立即注册
查看: 3142|回复: 9

[已解决]双层循环

[复制链接]
发表于 2017-7-27 21:17:06 | 显示全部楼层 |阅读模式

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

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

x
.......
   mov cx,4
s0:mov si,0
   mov cx,3
s:mov al,[bx+si]
  .......
  loop s
  add bx,16
  loop s0  
问题是执行loop s 时 应该用哪个cx ?为什么?
      执行loop s0时 应该用哪个cx?为什么?
最佳答案
2017-7-27 21:36:34
汇编的循环是先执行再判断,也就是说前面mov cx,4完全没有用,在后面loop s的时候用的cx值为3,s循环结束之后到loop s0的时候cx的值为0,这个时候loop指令无法判断出cx是从1减到0,而是直接在0的基础上再往下减,最后会构成一个死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-27 21:36:34 | 显示全部楼层    本楼为最佳答案   
汇编的循环是先执行再判断,也就是说前面mov cx,4完全没有用,在后面loop s的时候用的cx值为3,s循环结束之后到loop s0的时候cx的值为0,这个时候loop指令无法判断出cx是从1减到0,而是直接在0的基础上再往下减,最后会构成一个死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-27 23:36:23 | 显示全部楼层
记得要用双层循环应该先把外层cx先入栈,内层用完后,再出栈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-28 09:44:57 | 显示全部楼层
1762075716 发表于 2017-7-27 21:36
汇编的循环是先执行再判断,也就是说前面mov cx,4完全没有用,在后面loop s的时候用的cx值为3,s循环结束 ...

那我还想问问 怎么判断用哪个cx啊?距离loop最近的吗?还是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-28 09:52:26 | 显示全部楼层
ba21 发表于 2017-7-27 23:36
记得要用双层循环应该先把外层cx先入栈,内层用完后,再出栈

我就是想知道怎么判断用哪个cx  你说的我不大明白 刚开始接触汇编 菜鸟一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 10:08:06 | 显示全部楼层
xiaosi1219 发表于 2017-7-28 09:52
我就是想知道怎么判断用哪个cx  你说的我不大明白 刚开始接触汇编 菜鸟一个

哪个最近就是用的哪个cx,就你这里s0 是 mov cx,4; s 是mov cx,3;不过这肯定是问题代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 11:53:36 From FishC Mobile | 显示全部楼层
xiaosi1219 发表于 2017-7-28 09:44
那我还想问问 怎么判断用哪个cx啊?距离loop最近的吗?还是什么?

就是离loop最近的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 13:41:14 | 显示全部楼层
.......
   mov cx,4
s0:mov si,0
   mov cx,3
s:mov al,[bx+si]
  .......
  loop s
  add bx,16
  loop s0  
问题是执行loop s 时 应该用哪个cx ?为什么?
      执行loop s0时 应该用哪个cx?为什么?

cx只有一个,是否loop,只判断cx是否为零。cx=0了循环就完成了,接着执行下一条指令。
这个程序本意是要执行两层循环的,但是第二层循环把唯一的cx改变了,达不到目的。
应该这样:
        mov cx,4
s0:   push cx                        ;保存外层循环cx的值
        mov cx,3       
        s:    mov al,[bx+si]
               loop s
        add bx,16
        pop cx                     ;恢复外层循环cx的值
loop s0                                ;记住这里cx-1了,循环到上面push cx时,保存的是cx-1的值。


loop s0 相当于 cx-1, 然后判断cx,不等于0,就jmp s0.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 10:13:00 | 显示全部楼层
我的理解是 loop S 用值为3的cx,loop S0 用值为4的cx
不过,在执行内部循环也就是列的循环的时候,会改变cx 的值,进而影响外部循环也就是行循环。
这时候就要用楼上的  用栈来保护外部的cx 的值,让它不受影响,最后用的时候再拿出来。   
应该是我理解的这样,刚学到这点,一起加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 10:14:04 | 显示全部楼层
cx  只有一个,我那样说是为了解释清楚一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 10:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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