《汇编语言》学习(七)寻址

时间:2021-08-09 03:21:29

    《汇编语言》第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码的特征)。