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码。如下面的程序。

image-20211202105259999 image-20211202105345508

上面的源程序中:

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所示。

image-20211202105557076

7.4 大小写转换的问题

字母的大写字符和小写字符所对应的ASCII码如下。

image-20211203104319080

可以看出,就ASCII码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。大写字母 ASCII码的第5位为0,小写字母的第5位为1。

image-20211203104500322 image-20211203104509963

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]的方式进行数组的处理

image-20211203111308080

如果用高级语言,比如C语言来描述上面的程序,大致是这样的:

image-20211203111329300

7.7 SI和DI

sidi是8086CPU中和 bx 功能相近的寄存器,si 和 di 不能够分成两个8位寄存器来使用。下面的3组指令实现了相同的功能。

image-20211203111625442 image-20211203112050472

代码段如下:

image-20211203112117241

注意,在程序中,==用16位寄存器进行内存单元之间的数据传送,一次复制2个字节==,一共循环8次。

简化代码:

image-20211203112349743

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]用两个变量和一个常量表示地址。

实验

image-20211203171616294 image-20211203171634874

一般来说,在需要暂存数据的时候,我们都应该使用栈。栈空间在内存中,采用相关的指令,如 push、pop等,可对其进行特殊的操作。

image-20211203171939367

==编程(待完成)==

将datasg段中每个单词的前4个字母改为大写字母。

image-20211203172042344
1
待完成