汇编中循环嵌套

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ma2595162349/article/details/90733224

          先来看一段代码:

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一下。

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

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

   

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

猜你喜欢

转载自blog.csdn.net/ma2595162349/article/details/90733224
今日推荐