版权声明:本文为博主原创文章,未经博主允许不得转载。 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一下。
程序加载时,可以看到程序的字符串和栈段
程序运行后,可以看到字符串发生了改变。
参考资料:<<汇编语言>>王爽