7.1 and和or指令
(1) and指令:逻辑与指令,按位进行与运算。
例如指令:
mov al,01100011B
and al,00111011B
执行后: al=00100011B
通过该指令可将操作对象的相应位设为0,其他位不变。例如:
将al的第6位设为0的指令是:and al,10111111B
(2) or指令:逻辑或指令,按位进行或运算。
例如指令: mov al,01100011B
or al,00111011B
执行后:al=01111011B
7.3 以字符形式给出的数据
我们可以在汇编程序中,用db '......'
的方式指明数据是以字符的形式给出的(db:define byte),编译器将把它们转化为相对应的ASCII码。如下面的程序。
上面的源程序中:
“db 'unIX'
”相当于“db 75H,6EH,49H,58H
”,“u”、“n”、“I”、“X”的ASCII码分别为75H、6EH、49H、58H;
“mov al, 'a'
”相当于“mov al,61H
”,“a”的ASCII码为61H;
将程序7.1编译为可执行文件后,用Debug 加载查看data段中的内容,如图7.1所示。
7.4 大小写转换的问题
字母的大写字符和小写字符所对应的ASCII码如下。
可以看出,就ASCII码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。大写字母 ASCII码的第5位为0,小写字母的第5位为1。
7.5 [bx+idata]
在前面,我们用[bx]
的方式来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元:[bx+idata]
表示一个内存单元,它的偏移地址为(bx)+idata
(bx中的数值加上idata)。
指令mov ax,[bx+200]
的含义:
将一个内存单元的内容送入 ax,这个内存单元的长度为2个字节(字单元),存放一个字,偏移地址为bx中的数值加上 200,段地址在ds 中。
数学化的描述为:(ax)=((ds)*16+(bx)+200)
该指令也可以写成如下格式(常用):
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[ bx].200
7.6 用[bx+idata]的方式进行数组的处理
如果用高级语言,比如C语言来描述上面的程序,大致是这样的:
7.7 SI和DI
si
和di
是8086CPU中和 bx 功能相近的寄存器,si 和 di 不能够分成两个8位寄存器来使用。下面的3组指令实现了相同的功能。
代码段如下:
注意,在程序中,==用16位寄存器进行内存单元之间的数据传送,一次复制2个字节==,一共循环8次。
简化代码:
7.8 [bx+si]和[bx+di]
[bx+si]
表示一个内存单元,它的偏移地址为(bx)+(si)
(即 bx中的数值加上 si中的数值)。
指令mov ax,[bx+si]
的含义如下:
将一个内存单元的内容送入 ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds 中。
数学化的描述为:(ax)=((ds)*16+(bx)+(si))
该指令也可以写成如下格式(常用):
mov ax,[bx][si]
7.10 不同的寻址方式的灵活应用
(1)[idata]
用一个常量来表示地址,可用于直接定位一个内存单元;
(2)[bx]
用一个变量来表示内存地址,可用于间接定位一个内存单元;
(3)[bx+idata]
用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
(4)[bx+si]
用两个变量表示地址;
(5)[bx+si+idata]
用两个变量和一个常量表示地址。
实验
一般来说,在需要暂存数据的时候,我们都应该使用栈。栈空间在内存中,采用相关的指令,如 push、pop等,可对其进行特殊的操作。
==编程(待完成)==
将datasg段中每个单词的前4个字母改为大写字母。
|
|