更灵活的定位内存地址的方法
and 和 or 指令(位运算)
and 指令 --> 逻辑与运算(参考java中的逻辑与 & )
通过该指令可以将操作对象的相应位设为0,其他位不变
如:
将al的第6位设为0:and al,10111111B
将al的第7位设为0:and al,01111111B
将al的第0位设为0:and al,11111110B
or 指令 --> 逻辑或运算(参考java中的逻辑或 | )
通过该指令可以将操作对象的相应位设为1,其他位不变
如:
将al的第6位设为1:or al,01000000B
将al的第7位设为1:or al,10000000B
将al的第0位设为1:or al,00000001B
以字符形式给出的数据
大小写转化的问题(改变它的ASCII码)
大写 二进制 小写 二进制
A 01000001 a 01100001
B 01000010 b 01100010
C 01000011 c 01100011
D 01000100 d 01100100
即小写字母在二进制编码下的第五位不同
小写字母的ASCII的值比大写字母多20H
利用 and 和 or 指令可以将大小写转化
将第五位换成1 --> 小写字母
将第五位换成0 --> 大写字母
【bx+idata】(表示一个内存单元,它的偏移地址位 bx内的值 + idata)
可以在一个段中对不同的数据进行处理,避免多次循环
如上代码需要循环8次
如上代码只需要4次
这就是【bx+idata】对数组的简化作用
SI和DI
这两个与通用寄存器的差别在于不能分为两个8位寄存器来使用
其他功能和通用寄存器相近
利用 si 和 di 实现字符串的转移
用 ds:si 指向要复制的原始字符串
用 ds:di 指向要复制的目的空间
或者【bx+si】/【bx+di】
利用循环来解决
这里注意,由于si 和 di是16位寄存器,所以一次是复制2个字节,若总共有16个字节的数据,则总共循环8次
若程序复杂,寄存器都被使用了,该怎么暂存变量 --> 内存(给它开辟一个内存,并放入,不占用寄存器)
也可以用栈来解决这个问题 --> 将要存的数据放入栈段中,使用的时候再拿出来即可(通常用在二重及以上的循环),如图