《汇编语言》第7章主要介绍汇编语言中的几种寻址方式,除了一般的“段+偏移”外,对于数组,还有“基地址+索引”这种类似C语言的寻址方式。本章的学习主要在于对各种寻址方式的理解和灵活运用——不同的寻址方式是为了更好地解决不同应用场景下的问题而设计的。
本文我将先给出一个知识图谱,然后再列几个小程序演示这一课的重点内容。
一、知识图谱
二、程序清单
1,大小写转换
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIx'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111b
mov [bx],al
mov ah,[5+bx]
or ah,00100000b
mov [5+bx],ah
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
这个程序用于将“BaSic”中的小写转为大写,将“MinIx”中的大写转为小写。它主要运用“字符的ASCII编码的特征”和“按位逻辑运算”两种理论,标红的行是其中的关键行,需要仔细体会。
大写 十六进制 二进制 小写 十六进制 二进制
A 41 01000001 a 61 01100001
B 42 01000010 b 62 01100010
C 43 01000011 c 63 01100011
D 44 01000100 d 64 01100100
E 45 01000101 e 65 01100101
2,数组的寻址
用C语言实现上述程序的功能,如下:
char a[] = "BaSiC";
char b[] = "MinIX";
void main()
{
int i = 0;
do
{
a[i] = a[i] & 0xDF;
b[i] = b[i] | 0x20;
i++;
} while (i < 5);
}
汇编程序中的“[bx]和[5+bx]”,可以分别写成“0[bx]和5[bx]”。对比两个程序:
C语言: a[i], b[i]
汇编语言:0[bx], 5[bx]
我们可以发现,[bx+idata]的方式为高级语言实现数组提供了便利机制。
3,二重循环
编程,将datasg段中的每个单词的前4个字母改写为大写字母。
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,10h
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s:push cx
mov si,0
mov cx,4
s0:mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s0
add bx,10h
pop cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
这道编程题,综合运用了本章的各个知识点——按位逻辑运算,寻址,栈缓存,二重循环。请仔细体会以下几点:
1,栈缓存数据的便利性(不用记录数据保存的位置)。
2,二重循环的处理(两个循环变量)。
3,按位逻辑运算(ASCII码的特征)。