汇编中循环嵌套

          先来看一段代码:

assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '
datasg ends

stacksg segment
    dw 0,0,0,0,0,0,0,0
stacksg ends

codesg segment
    start:mov ax,stacksg
          mov ss,ax
          mov sp,16
          mov ax,datasg
          mov ds,ax
          mov bx,0

          mov cx,4
       s0:push cx     ;将外层循环的cx值压栈,在需要暂存数据时,一般选择栈
          mov si,0
          mov cx,3    ;设置内循环次数
        s:mov al,[bx+si]
          and al,11011111b  ;将字母变成大写
          mov [bx+si],al   ;变成大写重新赋值回去
          inc si          ;si自增,bx的值一直没变
          loop s

          add bx,16     ;程序的数据段是一块连续的内存,且bx一直为0,加上16指向下一个字符串
          pop cx      ;将栈顶的值传入寄存器cx中
          loop s0

          mov ax,4c00H
          int 21H
codesg ends
end start

     上述的程序的作用是将datasg段中每个单词改为大写字母,每个字符串的长度为16。程序先指定ss:sp和ds:bx。程序中[bx+si]可以表示一个地址,前面说过[bx+idata],其中idata是一个常数,现在这个si是一个寄存器,[bx+si+idata]用2个变量和一个常量表示一个地址,这样也是允许的。

    因为要用cx设置内循环次数,所以要外循环的cx用栈保存起来,内循环完成之后再pop,pop后cx自减,然后再被push入栈,这样完成循环嵌套。下面来debug一下。

   程序加载时,可以看到程序的字符串和栈段

  程序运行后,可以看到字符串发生了改变。

   

 

 

 

 

参考资料:<<汇编语言>>王爽

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值