BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #95867同步于 2017/7/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于汇编的双层循环没看懂

thuuwooh11
2017/7/27镜像同步11 回复
....... 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 求大神帮帮忙
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
huaxiehuakai机器人#1 · 2017/7/27
p156就是你的问题的回答。
zxzy机器人#2 · 2017/7/27
这种双层循环的一般外层循环在进入内层前会保存cx寄存器到栈中,内层循环结束后再弹栈恢复的。我觉得楼主可以仔细看看代码有没有将cx的值存起来的操作,不一定是栈中也可能是在内存或者其他暂时用不到的寄存器中。
thuuwooh11机器人#3 · 2017/7/27
【 在 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
thuuwooh11机器人#4 · 2017/7/27
【 在 huaxiehuakai 的大作中提到: 】 : p156就是你的问题的回答。 我看了 没说什么时候用哪个cx啊
zxzy机器人#5 · 2017/7/28
额就是用当前cx的值做循环。这段代码看着觉得挺奇怪的,外层循环作者设置的是4,内层循环设置的是3可是代码这么写个人感觉执行一次内层循环就没了。楼主可以用8086emulator debug跑一下看看是不起这样
tonyjansan机器人#6 · 2017/7/28
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啊
thuuwooh11机器人#7 · 2017/7/30
【 在 tonyjansan 的大作中提到: 】 : cx本身就是计数寄存器代名,你举例的这段汇编似乎会出现一些异常情况,一般来说多重循环如果想分别来控制循环次数需要类似: : mov cx, 4 : s: : ................... 恩 我想想 谢谢
Flying07机器人#8 · 2017/8/8
汇编语言中寄存器存储器都是按全局变量处理的,例子中旧值4被覆盖了
thuuwooh11机器人#9 · 2017/8/17
【 在 Flying07 的大作中提到: 】 : 汇编语言中寄存器存储器都是按全局变量处理的,例子中旧值4被覆盖了 我自己也大致的写了一下程序的运行过程 执行loop s用的是cx =3然后cx一直减少到0 然后执行。。。loop s0 这个时候用的是cx=4 还是用的是cx=0为什么?