与其说这一章是在讲如何在汇编语法上更方便的定位内存地址,不如说是如何在底层中抽象出一种数据结构来。
and和or指令
and指令:逻辑与指令,按位进行计算,全一得一
or指令:逻辑或指令,按位进行计算,逢一得一
以字符形式给出数据
在汇编程序中,以'....'
指明数据是以字符的形式给出的,编译器将把他们转换位相应的ASCII码。
ASCII码大小写转换的问题
同一个字母的大写写小写字符对应的ASCII码是不同的,他们之间相差20H。使用二进制表示也就是相差100000B。
所以很明显的看出来,大写字母和小写字母之间的区别就是第6位(位数从1开始计算)是否为1。
[bx+idata]
mov ax, [bx+200]
数学化的描述为:(ax)=((ds)*16+(bx)+200)
该指令还可以写成如下形式: mov ax, [200+bx]
mov ax, 200[bx]
mov ax, [bx].200
si和di
在8086中和bx功能相近的寄存器,bx是默认的数据段偏移地址寄存器。
si和di都可以作为数据段偏移地址寄存器来使用,与bx的用法相同。但si和di不能够分成两个8位寄存器。
[bx+si]和[bx+di]
之前是一个常量加上一个变量(bx),现在是两个常量,可以看出来,偏移地址的指定更加的灵活了。
指令mov ax, [bx+si]
数学化的描述为:(ax)=((ds)*16+(bx)+(si))
也可以是以下格式: mov ax, [bx][si]
[bx+si+idata]
不必多说,应该很容易明白。
不同的寻址方式的灵活应用
- [idata]用一个常量来表示地址,用于直接定位一个内存单元
- [bx]用一个变量来表示内存地址,用于间接定位一个内存单元
- [bx+idata]用一个变量和常量表示地址,在一个起始地址的基础上偏移
- [bx+si]用两个变量表示地址
- [bx+si+idata]用两个变量和一个常量表示地址
问:如何实现一个嵌套的循环
答:使用另外一个寄存器或者使用内存展示存储cx的值,在遇到对应的循环语句时将其取出。