[Intel汇编-MASM]嵌套循环问题
2014-12-18 15:27
253 查看
1. 嵌套循环中循环计数器不够的问题:
1) 即多重循环就需要有多个循环计数器,并且每个计数器都是相互独立的,分别为各自的循环技术;
2) 但是对于loop指令只提供了cx这一个计数器,这就产生了多个循环争用一个cx计数器的竞争问题了;
3) 这个问题的解决方思路就是在进入一层循环的开始先将外面一层循环的计数器先保存起来,等到内存循环退出的时候在将外层循环的计数器重新恢复,因此这里如何保存计数器就有多种选择了;
4) 可供的选择有:
i. 可以将cx先保存在某个寄存器中:不好!因为寄存器资源非常有限,如果循环层数一多就会造成寄存器迅速枯竭,这样会导致资源浪费;
ii. 将cx保存在普通的内存数据区:不好!如果循环层数一多,就会占用多个内存单元保存cx,这会增加程序的维护成本,必须记住每个备份的cx在内存中所在的位置,并且不能将它们的顺序搞错,这会加大程序出错的风险,同时增大程序员的压力;
iii. 将cx保存在栈中:可取!这也是标准的做法,压栈和弹栈的顺序刚好符合循环嵌套的顺序,并且只需要push和pop操作,无需程序员自己维护栈中的区域;
2. 示例:将每行的单词变成大写:
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运行结果:
相关文章推荐
- [Intel汇编-MASM]内存访问方式以及循环程序的调试
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- [Intel汇编-MASM]程序中可用的寄存器
- [Intel汇编-MASM]源程序的组成以及编译调试
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- [Intel汇编-MASM]转移指令
- 嵌套循环应该注意的问题
- for循环里嵌套使用ajax遇到的问题
- [Intel汇编-MASM]与或以及乘除
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 【Stackoverflow好问题】从一个多层嵌套循环中直接退出
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- [Intel汇编-MASM]用DS寄存器定义一段数据
- [Intel汇编-MASM]内存单元访问扩展