第七章 更灵活的定位内存地址的方法
7.1 and 和 or 指令
- and 指令:逻辑与,按位进行与运算。
通过该指令可将操作对象的相应位设为 0,其他位不变。
- or 指令:逻辑或,按位进行或运算。
通过该指令可将操作对象的相应位设为 1,其他位不变。
7.2 关于 ASCII 码
略。
7.3 以字符形式给出的数据
在汇编程序中,用 ’……‘ 的方式指明数据是以字符的形式给出的,编译器将把它们转化为对应的 ASCII 码。
assume
7.4 大小写转换的问题
就 ASCII 码的二进制形式来看,除第 5 位(位数从 0 开始计算)外,大写字母和小写字母都一样。大写字母 ASCII 码的第 5 位为 0,小写字母 ASCII 码的第 5 位为 1。这样就可以用 or 和 and 来将大小写字母转换,而无须引入判断指令。完整程序如下:
assume
7.5 [bx+idata]
[bx+idata] 表示一个内存单元,它的偏移地址为(bx)+idata(bx 中的数值加上idata)。
move ax,[bx+200] 的含义:将一个内存单元的内容送入 ax,这个内存单元的长度为 2个字节(字单元),存放一个字,偏移地址为 bx 中的数值加上 200,段地址在 ds 中。
该指令也可以写成如下格式:
mov
7.6 用 [bx+idata] 的方式进行数组的处理
在 codesg 中填写代码代码,将 datasg 中定义的第一字符串转化为大写,第二个字符串转化为小写。
assume
用 [bx+idata] 改进后如下:
mov
7.7 SI 和 DI
si 和 di 是 8086CPU 中和 bx 功能相近的寄存器,si 和 di 不能够分成两个 8 位寄存器来使用。下面的 3 组指令实现了相同的功能。
# 1
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 中。
该指令也可以写成如下格式:
mov
7.10 不同寻址方式的灵活应用
比较前面几种定位内存地址的方法(可称为寻址方法),就可以发现:
- [idata] 用一个常量来表示地址,可用于直接定位一个内存单元;
- [bx] 用一个变量来表示内存地址,可用于间接定位一个内存单元;
- [bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
- [bx+si] 用两个变量表示地址;
- [bx+si+idata] 用两个变量和一个常量表示地址。