十五、嵌套循环

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:
	mov		ax, datasg
	mov		ds, ax
	mov		ax, stacksg
	mov		ss, ax
	mov		sp, 10

	mov		al, 11011111B

	mov		bx, 0 ; row counter!
	mov		cx, 4
lp1:
	push	cx ; reserve cx!

	mov		si, 0 ; column counter!
	mov		cx, 3
	lp2:
		and		[bx][si], al	
		inc		si ; col++
		loop	lp2

	add		bx, 10H ; row++
	pop		cx ; recover cx!
	loop	lp1
codesg ends

end start
运行结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值