要完整地描述一个内存单元,需要两种信息:1.内存单元的地址2.内存单元的长度(类型)
单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出
我们定义的描述性的符号“( )”——表示一个寄存器或一个内存单元中的内容。
约定符号idata表示常量
5.1[BX]
注意 inc bx的含义是bx中的内容加1.
5.2Loop指令
loop指令的格式是:loop 标号, CPU执行loop指令的时候,要进行两步操作,1 (cx)=(cx)-1 2.判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
从上面的描述中,可以看到,cx中的值影响着loop指令的执行结果。通常我们用loop指令来实现循环功能,cx中存放循环次数。
我们可以总结出用cx 和 loop指令相配合实现循环功能的3个要点:
1 在cx中存放循环功能;
2 loop指令中的标号所标识地址要在前面
3 要循环执行的程序段,要写在标号和loop指令的中间。
用cx和loop指令相配和实现循环功能的程序框架如下。
mov cx,循环次数
s:
循环执行的程序段
loop s
5.3在Debug中跟踪用loop指令实现的循环程序
在书写的时候都是以字母开头的,而在汇编源程序中,数据不能以字母开头,所以要在前面加0.
我们希望将循环一次执行完。可以使用p命令来执行。
5.4Debug和汇编编译器masm对指令的不同处理
5.5loop和[bx]的联合应用
怎样解决这两个看似矛盾的问题?目前的方法就是得用一个16位寄存器来做中介。将内存单元中的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。
5.6段前缀
5.7一段安全的空间
在不能确定一段内存空间中是否存放着重要的数据或代码的时候,不能随意向其中写入内容。
不要忘记,我们是在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。如果我们需要向内存空间写入数据的话,要使用操作系统给我们分配的空间,而不应直接用地址任意指定内存单元,向里面写入。
注意,我们在纯DOS方式(实模式)下,可以不理会DOS,直接用汇编语言去操作真实的硬件,因为运行在CPU实模式下的DOS,没有能力对硬件系统进行全面,严格地管理。但在Windows 2000,Unix这些运行于CPU保护模式下的操作系统中,不理会操作系统,用汇编语言去操作真实的硬件,是根本不可能的。硬件已经被这些操作系统利用CPU保护模式所提供的功能全面而严格地管理了。
在一般的PC机中,DOS方式下,DOS和其他合法的程序一般都不会使用0:200-0:2FF的256个字节的空间。所以我们使用这段空间是安全的。不过位谨慎起见,在进入DOS后,我们可以先用Debug查看一下,如果0:200~0:2ff单元的内容都是0的话,则证明DOS和其他合法的程序没有使用这里。
总结一下:
1:我们需要直接向内存中写入内容
2:这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误。
3:DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码
4:以后,我们需要直接向一段内存中写入内容时,就使用0:200~0:2ff这段空间。