更灵活的定位内存地址的方法
前面我们使用[0]、[bx]的方法定位内存单元。
1. and和or指令
a) and指令:逻辑与指令,按位进行与运算。通过该指令可将操作对象的相应位设为0,其他位不变。
b) or指令:逻辑或指令,按位进行或运算。通过该指令可将操作对象的相应位设为1,其他位不变。
2. 字符串
字符串使用单引号括起来的,字符串的每个字符都会转换成ASCLL码进行存储。
大写字母和小写字母相差32D(20H,a——61H,97D,A——41H,65D)。但大写字母和小写字母在二进制位中只是第五位不同,其他位都相同(第五位大写:0,小写1),因此在大小写转换修改第五位即可。
3. [bx+idata]
前面使用[BX]的方式来指明一个内存单元,还可以用一种更灵活的方式来指明内存单元:[bx+idata]或者[bx].idata;它的偏移地址为(bx)+idata。((ds)*16+(bx)+idata)。
4. 使用[bx+idata]方式进行数组的处理
有了[bx+idata]这种表示内存单元的方式,就可以用更高级的结构来看到所要处理的数据。
5. SI和DI
SI和DI是8086CPU中和bx功能相近的寄存器,SI、DI不能够分成两个8位寄存器来使用。可以和bx替换,进行保存偏移地址。
在处理数据之前首先要搞清楚数据存储在什么地方,即数据的内存地址。
6. [bx+si]和[bx+di]
a) 可以使用[bx(si/di)]和[bx(si/di)+idata]的方式来指明一个内存单元,还可以用更灵活的方式:[bx+si]和[bx+di]。
b) [bx+si]和[bx+di]的含义相似,[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即:bx中的数值加上si中的数值)。
7. [bx+si+idata]和[bx+di+idata]。
同[bx+si]和[bx+di]类似,最后需要加上idata形成最终的偏移地址。
8. 不同的寻址方式的灵活运用
a) [idata]:用一个常量来表示地址,可用于直接定位一个内存单元
b) [bx]:用一个变量来表示内存地址,可用于间接定位一个内存单元
c) [bx+idata]:用一个变量和常量表示地址,可在一个骑士地址的基础上用变量间接定位一个内存地址
d) [bx+si]:用两个变量表示地址
e) [bx+si+idata]:用两个变量和一个常量表示地址。
9. 暂存数据
在进行循环的时候,loop指令只能读取cx中的数据进行循环。
那么当有嵌套循环时怎么办呢? 在开始内循环前使用一个寄存器临时保存外循环的(cx),在结束内循环后再将临时保存的(cx)恢复到cx中。
在保存临时(cx)时程序中已使用的寄存器是不能用来保存cx,并且寄存器的数量有限,那么可以使用内存来保存cx。如果使用内存保存,那么就需要开辟一段内存空间进行保存。
内存保存数据弊端:
当有多个数据需要保存时,使用内存保存数据容易混乱,需要记住数据放到了哪个单元中。一般来说,在需要暂存数据的时候,我们都应该使用栈(push、pop),可对其进行他书的操作。