汇编嵌套循环计数器问题

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

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

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

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

    4) 可供的选择有:

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

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

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


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

  1. assume cs:codesg, ds:datasg, ss:stacksg  
  2.   
  3. datasg segment  
  4.     db ‘ibm             ’  
  5.     db ‘dec             ’  
  6.     db ‘dos             ’  
  7.     db ‘vax             ’  
  8. datasg ends  
  9.   
  10. stacksg segment  
  11.     db 10 dup(0)  
  12. stacksg ends  
  13.   
  14. codesg segment  
  15.   
  16. start:  
  17.     mov     ax, datasg  
  18.     mov     ds, ax  
  19.     mov     ax, stacksg  
  20.     mov     ss, ax  
  21.     mov     sp, 10  
  22.   
  23.     mov     al, 11011111B  
  24.   
  25.     mov     bx, 0 ; row counter!  
  26.     mov     cx, 4  
  27. lp1:  
  28.     push    cx ; reserve cx!  
  29.   
  30.     mov     si, 0 ; column counter!  
  31.     mov     cx, 3  
  32.     lp2:  
  33.         and     [bx][si], al      
  34.         inc     si ; col++  
  35.         loop    lp2  
  36.   
  37.     add     bx, 10H ; row++  
  38.     pop     cx ; recover cx!  
  39.     loop    lp1  
  40. codesg ends  
  41.   
  42. end start  
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
运行结果:



原文:http://blog.csdn.net/lirx_tech/article/details/42006185

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值