十五、嵌套循环

时间:2022-09-08 11:29:36

1. 嵌套循环中循环计数器不够的问题:

    1) 即多重循环就需要有多个循环计数器,并且每个计数器都是相互独立的,分别为各自的循环技术;

    2) 但是对于loop指令只提供了cx这一个计数器,这就产生了多个循环争用一个cx计数器的竞争问题了;

    3) 这个问题的解决方思路就是在进入一层循环的开始先将外面一层循环的计数器先保存起来,等到内存循环退出的时候在将外层循环的计数器重新恢复,因此这里如何保存计数器就有多种选择了;

    4) 可供的选择有:

        i. 可以将cx先保存在某个寄存器中:不好!因为寄存器资源非常有限,如果循环层数一多就会造成寄存器迅速枯竭,这样会导致资源浪费;

        ii. 将cx保存在普通的内存数据区:不好!如果循环层数一多,就会占用多个内存单元保存cx,这会增加程序的维护成本,必须记住每个备份的cx在内存中所在的位置,并且不能将它们的顺序搞错,这会加大程序出错的风险,同时增大程序员的压力;

        iii. 将cx保存在栈中:可取!这也是标准的做法,压栈和弹栈的顺序刚好符合循环嵌套的顺序,并且只需要push和pop操作,无需程序员自己维护栈中的区域;


2. 示例:将每行的单词变成大写:

assume cs:codesg, ds:datasg, ss:stacksg

datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends

stacksg segment
db 10 dup(0)
stacksg ends

codesg segment

start:
movax, datasg
movds, ax
movax, stacksg
movss, ax
movsp, 10

moval, 11011111B

movbx, 0 ; row counter!
movcx, 4
lp1:
pushcx ; reserve cx!

movsi, 0 ; column counter!
movcx, 3
lp2:
and[bx][si], al
incsi ; col++
looplp2

addbx, 10H ; row++
popcx ; recover cx!
looplp1
codesg ends

end start
运行结果:

十五、嵌套循环