7.1 and 和 or 指令
and指令:逻辑与指令,按位进行与运算
mov al,01100011B
and al,00111011B
执行结果:
al = 00100011B
通过该指令可将操作对象的相应位设为0,其它位不变
or指令:逻辑或指令,按位进行或运算
mov al,01100011B
or al,00111011B
执行结果:
al = 01111011B
通过该指令可将操作对象的相应位设为1,其它位不变
7.2 关于ASCII码
计算机中所有的信息都是二进制,而人能理解的信息是具有约定意义的字符
如果将123,desk,BASIC这些信息存储在计算机里,就要对其进行编码,将其转化为二进制信息进行存储,而计算机要将这些信息再显示给我们看,就要再对其进行解码,只要编码和解码采用同样的规则,我们就能将人能理解的信息存入到计算机,再从计算机中取出
所谓编码方案,就是一套规则,它约定了用什么信息来表示现实对象
在文本编辑的过程中,当我们按下a时,就会在屏幕上显示a,这个过程具体实现是:
按下a时,这个按键的信息被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化成61H存储在内存的指定空间中,文本编辑器从内存中取出61H,将其送到显卡的显存中,工作在文本模式下的显卡,用ASCII码的规则解释显存中的内容,61H被当作字符a,显卡驱动显示器,将字符a的图像画在屏幕上
7.3 以字符形式给出的数据
在汇编中,以’ '的方式指明数据是以字符的形式给出的,编译器将它们转化为相对应的ASCII码
上面程序中,db 'unIx’相当于 db 75H,6EH,49H,58H,四个16位数对应着u,n,I,X,db用来定义字符或字符串
7.4 大小写转换的问题
考虑将下面程序第一个字符串转化为大写,第二个字符串转化为小写
assume cs:code,ds:data
data segment
db 'BaSiC'
db 'iNfOrMaTiOn'
data ends
code segment
start:
code ends
end start
我们知道同一个字母的大写字符和小写字符相对应的ASCII码是不同的,如’A’的ASCII码是41H,'a’的ASCII码值是61H,要改变一个字母的大小写,其实就是改变它所对应的ASCII码
小写字母的ASCII码比大写字母的ASCII码值大20H,将’a’的ASCII码值减20就可以得到 ‘A’,为了完成需要,程序必须能判断一个字母是大写还是小写,需要一条判断指令,但此处还未涉及到,从另一角度考虑
就ASCII码的二进制来看,除第5位(从右向左,从0开始)外,大写字母和小写字母的其它位都一样,大写字母ASCII码的第五位为0,小写字母ASCII码第5位为1,这样,一个字母,不管它原来是大写还是小写,将它的第五位置1就是小写,置0就是大写,利用and和or来进行位运算
7.5 [bx+idata]
前面可以使用[bx]的方式来指明一个内存单元,还可以使用一种更灵活的方式来指明一个内存单元:[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
如:mov ax,[bx+200]:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值+200,段地址在ds中,即(ax)=((ds)*16+(bx)+200)
7.6 用[bx+idata]的方式进行数组的处理
将下列demo中data段内第一个字符串转化为大写,第二个字符串转化为小写
assume cs:code,ds:data
data segment
db 'BaSiC'
db 'MinIX'
data ends
code segment
start:
code ends
end start
使用[data+idata]的方式,将着两个字符串看作两个数组,一个从0开始存放,一个从5开始存放,那么可以用[0+bx]和[5+bx]的方式在同一个循环中定位这两个字符串中的字符
[bx+idata]的方式为高级语言实现数组提供了便利机制
7.7 SI 和 DI
si和di是8086CPU中和bx功能相近的寄存器,但si和bi不能分成两个8位寄存器来使用
下面3组指令实现了同样的功能:
mov bx,0
mov ax,[bx]
mov si,0
mov ax,[si]
mov di,0
mov ax,[di]
7.8 [bx+si] 和 [bx+di]
前面有用过 [bx(si/di)] 和 [bx(si/di)+idata]的方式来指明一个内存单元,还可以采用更灵活的方式:[bx+si] 和 [bx+di]
指令mov ax,[bx+si]含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中
即 (ax)=((ds)*16+(bx)+(si))
7.9 [bx+si+idata]和[bx+di+idata]
mov ax,[bx+si+idata]含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中
即(ax)=((ds)*16+(bx)+(si)+(idata))
7.10 不同的寻址方式的灵活应用
[idata]用一个常量表示地址,可用于直接定位一个内存单元
[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元
[bx+idata]用一个变量和一个常量表示地址,可以在一个起始地址的基础上用变量间接定位一个内存单元
[bx+si]用两个变量表示地址
[bx+si+idata]用两个变量和一个常量表示地址
通过灵活的方式来定位一个内存单元的地址,我们可以从更加结构化的角度来看待所要处理的数据
一般来说,在需要暂存数据的时候,都应该使用栈