本章需掌握:
- 寻址方式的意义和应用。
- 二重循环的处理
- 栈的应用
- 大小写的转化
- and,or指令
- 编程,将datasg段中的每个单词的头一个字母改写成大写字母。([bx+idata])
assume cs:code,ds:data
data segment //注意 每个字符串都是16位
db '1. file '
db '2. edit '
db '3. search '
db '4. view '
db '5. options '
db '6. help '
data ends
code segment
start:mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s: mov al,ds:[bx+3]
and al,11011111B
mov ds:[bx+3],al
add bx,16
loop s
mov ax,4c00h
int 21h
code ends
end start
注:大写字母ASCII码的第五位为0。小写字母的第五位为1。
将第五位强行置零或者置一,从而改变大小写。
- 编程,将datasg段中的每一个单词改为大写字母。
assume cs:code,ds:data
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s0: mov dx,cx
mov si,0
mov cx,3
s: mov al,ds:[bx+si]
and al,11011111B
mov ds:[bx+si],al
inc si
loop s
add bx,16
mov cx,dx
loop s0
mov ax,4c00h
int 21h
code ends
end start
注:上面代码,为了防止cx被覆盖,用dx临时保存了cx。
但是当有多层循环的时候,用多个寄存器来保存cx明显不现实。所以可以将其暂存在内存中的某个位置。但是更通常的做法,是将cx压入栈中,进行保存。具体代码和上述类似,略。
- 编程,将datasg段中的每一个单词的前4个字母改写成大写字母。
assume cs:code,ds:data,ss:stack
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s0:
push cx
mov si,3
mov cx,4
s:
mov al,ds:[bx+si]
and al,11011111B
mov ds:[bx+si],al
inc si
loop s
pop cx
add bx,16
loop s0
mov ax,4c00h
int 21h
code ends
end start
总结:
-
[idata]用一个常量表示地址,可用于直接定位一个内存单元
-
[bx]用一个变量来保存内存地址,可用于间接定位一个内存单元
-
[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间隔定位一个内存单元
-
[bx+si]用两个变量表示地址
-
[bx+si+idata]用两个变量和一个常量表示地址
参考文章:
https://blog.csdn.net/u013018721/article/details/51232405
https://www.cnblogs.com/superzhao/p/4636489.html