汇编语言中二重循环的处理
题目:
编程,将datasg段中每个单词的前4个字母改为大写字母。
给出的程序结构如下
assume cs:codesg, ss:stacksg, ds:datasg
stacksg segement
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segement
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segement
start:
codesg ends
end start
给出我的理解过程:
内层循环从第4个字符开始,所以我们得使用一个寄存器来存储这个起始地址[3]
外层循环次数为4,因为总计4行数据要处理
然后是程序的编写(主要是循环体的设置),这里讲书中使用栈的思想临时保存数据:
- 设置外层循环次数,在标号前设置:mov cx, 4
- 外层循环开始,将外层循环次数cx压入栈中,设置内层循环起始地址si和循环次数cx
- 内层循环开始,将读出的字节单元存储到al中,并使用与操作将小写换大写:
and al, 11011111b (换大写,将倒数第三位强置0)
or al, 00100000b (换小写)
改变内层循环偏移量,即inc si - 内层循环结束,换层次循环的起始地址(也可以说换下一行),恢复外层循环cx(出栈),进行loop s(循环判断)
代码的编写
assume cs:codesg, ss:stacksg, ds:datasg stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends datasg segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' datasg 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 ;外层循环4次 s0: push cx ;暂存外层循环次数 mov si, 4 ;每行偏移4字节 mov cx, 4 ;内层循环4次 s: mov al, [bx+si] ;取数据 and al, 11011111b mov [bx+si], al inc si loop s add bx, 16 ;跳出内层循环,并换下一行 pop cx ;恢复外层循环次数 loop s0 ;判断外层循环cx mov ax, 4c00h int 21h codesg ends end start
结果展示:
原始数据
执行结束