xiaosi1219 发表于 2017-7-27 21:17:06

双层循环

.......
   mov cx,4
s0:mov si,0
   mov cx,3
s:mov al,
.......
loop s
add bx,16
loop s0
问题是执行loop s 时 应该用哪个cx ?为什么?
      执行loop s0时 应该用哪个cx?为什么?

1762075716 发表于 2017-7-27 21:36:34

汇编的循环是先执行再判断,也就是说前面mov cx,4完全没有用,在后面loop s的时候用的cx值为3,s循环结束之后到loop s0的时候cx的值为0,这个时候loop指令无法判断出cx是从1减到0,而是直接在0的基础上再往下减,最后会构成一个死循环

ba21 发表于 2017-7-27 23:36:23

记得要用双层循环应该先把外层cx先入栈,内层用完后,再出栈

xiaosi1219 发表于 2017-7-28 09:44:57

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

那我还想问问 怎么判断用哪个cx啊?距离loop最近的吗?还是什么?

xiaosi1219 发表于 2017-7-28 09:52:26

ba21 发表于 2017-7-27 23:36
记得要用双层循环应该先把外层cx先入栈,内层用完后,再出栈

我就是想知道怎么判断用哪个cx你说的我不大明白 刚开始接触汇编 菜鸟一个

ba21 发表于 2017-7-28 10:08:06

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

哪个最近就是用的哪个cx,就你这里s0 是 mov cx,4; s 是mov cx,3;不过这肯定是问题代码。

1762075716 发表于 2017-7-28 11:53:36

xiaosi1219 发表于 2017-7-28 09:44
那我还想问问 怎么判断用哪个cx啊?距离loop最近的吗?还是什么?

就是离loop最近的

erh 发表于 2017-7-28 13:41:14

.......
   mov cx,4
s0:mov si,0
   mov cx,3
s:mov al,
.......
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,
               loop s
        add bx,16
        pop cx                     ;恢复外层循环cx的值
loop s0                                ;记住这里cx-1了,循环到上面push cx时,保存的是cx-1的值。


loop s0 相当于 cx-1, 然后判断cx,不等于0,就jmp s0.

酸辣小白菜 发表于 2017-8-5 10:13:00

我的理解是 loop S 用值为3的cx,loop S0 用值为4的cx
不过,在执行内部循环也就是列的循环的时候,会改变cx 的值,进而影响外部循环也就是行循环。
这时候就要用楼上的用栈来保护外部的cx 的值,让它不受影响,最后用的时候再拿出来。   
应该是我理解的这样,刚学到这点,一起加油

酸辣小白菜 发表于 2017-8-5 10:14:04

cx只有一个,我那样说是为了解释清楚一点
页: [1]
查看完整版本: 双层循环