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