汇编语言 第七章 更灵活的定位内存地址的方法

7.1 and 和 or 指令

  1. and 指令:逻辑与,按位进行与运算。

    通过该指令可将操作对象的相应位设为 0,其他位不变。

  2. or 指令:逻辑或,按位进行或运算。

    通过该指令可将操作对象的相应位设为 1,其他位不变。 ### 7.2 关于 ASCII 码

略。

7.3 以字符形式给出的数据

在汇编程序中,用 ’……‘ 的方式指明数据是以字符的形式给出的,编译器将把它们转化为对应的 ASCII 码。

1
2
3
4
5
6
7
8
9
10
11
12
assume cs:code,ds:data
data segment
db 'unIX'
db 'foRK'
data ends
code segment
start: mov al,'a'
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start

7.4 大小写转换的问题

就 ASCII 码的二进制形式来看,除第 5 位(位数从 0 开始计算)外,大写字母和小写字母都一样。大写字母 ASCII 码的第 5 位为 0,小写字母 ASCII 码的第 5 位为 1。这样就可以用 or 和 and 来将大小写字母转换,而无须引入判断指令。完整程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
assume cs:codesg,ds:datasg
datasg segment
db 'BASIC'
sb 'iNfOrMaTiOn'
datasg ends
codesg segment
start: move ax,datasg
move ds,ax ;设置 ds 指向 datasg
move bx,0 ;设置
move cx,5 ;设置
s:move al,[bx] ;设置
and al,11011111B ;设置
move [bx],al ;设置
inc bx ;设置
loop s
move bx,5 ;设置
move cx,11 ;设置
s0:mov al,[bx]
or al,00100000B ;设置
mov [bx],al
inc bx
lop s0
mov ax,4c00h
int 21h
codesg ends
end start

7.5 [bx+idata]

[bx+idata] 表示一个内存单元,它的偏移地址为(bx)+idata(bx 中的数值加上idata)。

move ax,[bx+200] 的含义:将一个内存单元的内容送入 ax,这个内存单元的长度为 2个字节(字单元),存放一个字,偏移地址为 bx 中的数值加上 200,段地址在 ds 中。

该指令也可以写成如下格式:

1
2
3
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200

7.6 用 [bx+idata] 的方式进行数组的处理

在 codesg 中填写代码代码,将 datasg 中定义的第一字符串转化为大写,第二个字符串转化为小写。

1
2
3
4
5
6
7
8
9
10
assume cs:codesg,ds:datasg
datasg segment
db 'BaSIC'
sb 'MinIX'
datasg ends

codesg segment
starts:
codesg ends
end start

用 [bx+idata] 改进后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
mov ax,datasg
mov ds,ax
mov bx,0

mov cx 5
s: mov al,[bx] ; mov al,0[bx]
and al,11011111b
mov [bx],al ; mov 0[bx],al
mov al,[5+bx]
or al,00100000b
mov [5+bx],al ; mov 5[bx],al
inc bx
loop s

7.7 SI 和 DI

si 和 di 是 8086CPU 中和 bx 功能相近的寄存器,si 和 di 不能够分成两个 8 位寄存器来使用。下面的 3 组指令实现了相同的功能。

1
2
3
4
5
6
7
8
9
10
11
# 1
move bx,0
move ax,[bx]

#2
move si,0
move ax,[si]

#3
move di,0
move ax,[di]

7.8 [bx] 和 [bx+di]

还可以用 [bx+si] 和 [bx+di] 来指明一个内存单元。这两条命令含义相似,以前者为例。

[bx+si] 表示一个内存单元。偏移地址为(bx)+(si)。

mov ax,[bx+si] 的含义:将一个内存单元的内容送入 ax,这个内存单元的长度为 2 字节(字单元),存放一个字,偏移地址为 bx 中的数值加上 si 中的数值,段地址在 ds 中。

也可以写成 mov ax,[bx][si]。

7.9 [bx+si+idata] 和 [bx+di+idata]

[bx+si+idata] 和 [bx+di+idata] 的含义相似,以前者为例:

[bx+si+idata] 表示一个内存单元,偏移地址是 (bx)+(si)+idata。

mov ax,[bx+si+idata] 的含义:将一个内存单元的内容送入 ax,这个内存单元的长度为 2 字节(字单元),存放一个字,偏移地址为 bx 中的数值加上 si 中的数值再加上 idata,段地址在 ds 中。

该指令也可以写成如下格式:

1
2
3
4
5
mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200

7.10 不同寻址方式的灵活应用

比较前面几种定位内存地址的方法(可称为寻址方法),就可以发现:

  • [idata] 用一个常量来表示地址,可用于直接定位一个内存单元;
  • [bx] 用一个变量来表示内存地址,可用于间接定位一个内存单元;
  • [bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
  • [bx+si] 用两个变量表示地址;
  • [bx+si+idata] 用两个变量和一个常量表示地址。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×