返回信息流.......
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用哪个?为什么?这个是王爽老师的汇编语言的书上的例题 p155
求大神帮帮忙
这是一条镜像帖。来源:北邮人论坛 / cpp / #95867同步于 2017/7/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于汇编的双层循环没看懂
thuuwooh11
2017/7/27镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这种双层循环的一般外层循环在进入内层前会保存cx寄存器到栈中,内层循环结束后再弹栈恢复的。我觉得楼主可以仔细看看代码有没有将cx的值存起来的操作,不一定是栈中也可能是在内存或者其他暂时用不到的寄存器中。
【 在 zxzy 的大作中提到: 】
: 这种双层循环的一般外层循环在进入内层前会保存cx寄存器到栈中,内层循环结束后再弹栈恢复的。我觉得楼主可以仔细看看代码有没有将cx的值存起来的操作,不一定是栈中也可能是在内存或者其他暂时用不到的寄存器中。
这个汇编程序没用到栈区啊, 我看了书后面的解释 ,没说用哪个cx ,我就是想知道怎么判断执行loop时 用哪个cx ,有2个cx
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:mov si,0
mov cx,3
s: mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
loop s
add bx,16
loop s0
codesg ends
end start
额就是用当前cx的值做循环。这段代码看着觉得挺奇怪的,外层循环作者设置的是4,内层循环设置的是3可是代码这么写个人感觉执行一次内层循环就没了。楼主可以用8086emulator debug跑一下看看是不起这样
cx本身就是计数寄存器代名,你举例的这段汇编似乎会出现一些异常情况,一般来说多重循环如果想分别来控制循环次数需要类似:
mov cx, 4
s:
push cx
mov cx, 3
s0:
;; ...
loop s0
pop cx
loop s
如果不对计数寄存器内容做暂存,则cx内容会被覆写,即
cx = 4 ---> s ---> cx = 3 ---> s0 ---> loop s0两次 ---> cx = 0 ---> 退出s0,同时cx = 0 - 1 = 0xFFFF ---> loop s ---> cx = 3 ---> s0 ---> ......
【 在 thuuwooh11 的大作中提到: 】
: 我看了 没说什么时候用哪个cx啊
【 在 tonyjansan 的大作中提到: 】
: cx本身就是计数寄存器代名,你举例的这段汇编似乎会出现一些异常情况,一般来说多重循环如果想分别来控制循环次数需要类似:
: mov cx, 4
: s:
: ...................
恩 我想想 谢谢
【 在 Flying07 的大作中提到: 】
: 汇编语言中寄存器存储器都是按全局变量处理的,例子中旧值4被覆盖了
我自己也大致的写了一下程序的运行过程 执行loop s用的是cx =3然后cx一直减少到0 然后执行。。。loop s0 这个时候用的是cx=4 还是用的是cx=0为什么?