双层循环
.......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?为什么? 汇编的循环是先执行再判断,也就是说前面mov cx,4完全没有用,在后面loop s的时候用的cx值为3,s循环结束之后到loop s0的时候cx的值为0,这个时候loop指令无法判断出cx是从1减到0,而是直接在0的基础上再往下减,最后会构成一个死循环 记得要用双层循环应该先把外层cx先入栈,内层用完后,再出栈 1762075716 发表于 2017-7-27 21:36
汇编的循环是先执行再判断,也就是说前面mov cx,4完全没有用,在后面loop s的时候用的cx值为3,s循环结束 ...
那我还想问问 怎么判断用哪个cx啊?距离loop最近的吗?还是什么? ba21 发表于 2017-7-27 23:36
记得要用双层循环应该先把外层cx先入栈,内层用完后,再出栈
我就是想知道怎么判断用哪个cx你说的我不大明白 刚开始接触汇编 菜鸟一个 xiaosi1219 发表于 2017-7-28 09:52
我就是想知道怎么判断用哪个cx你说的我不大明白 刚开始接触汇编 菜鸟一个
哪个最近就是用的哪个cx,就你这里s0 是 mov cx,4; s 是mov cx,3;不过这肯定是问题代码。 xiaosi1219 发表于 2017-7-28 09:44
那我还想问问 怎么判断用哪个cx啊?距离loop最近的吗?还是什么?
就是离loop最近的 .......
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. 我的理解是 loop S 用值为3的cx,loop S0 用值为4的cx
不过,在执行内部循环也就是列的循环的时候,会改变cx 的值,进而影响外部循环也就是行循环。
这时候就要用楼上的用栈来保护外部的cx 的值,让它不受影响,最后用的时候再拿出来。
应该是我理解的这样,刚学到这点,一起加油 cx只有一个,我那样说是为了解释清楚一点
页:
[1]