要完整地描述一个内存单元,需要两种信息:
- 内存单元
- 内存单元的长度(类型)
在debug中可以直接使用[0]
来代替ds:0
但是在汇编语言中却不能够直接这样使用。只有两种选择:
- 将偏移地址放在bx寄存器,使用
[bx]
- 加上段前缀
书中使用的约定:
- 描述性符号
()
,该符号标识一个内存地址指向的字/字节空间 - 约定符号idata标识常量
loop指令
loop指令的格式是:loop标号,cpu执行loop指令的时候执行两部操作:
- (cx)=(cx)-1
- 判断cx中的值是否为0,为0则向下执行,否则转向标号处
所以一般cx中存放的即为循环的次数
cx和loop指令配合实现循环功能的要点:
- cx中存放循环次数
- loop指令中的标号所标识地址要在前面
- 要循环执行的程序段要写在标号和loop指令的中间
在debug中跟中使用loop指令实现的循环语句
如果需要直接执行完循环,则使用p执行loop指令,或者使用g指令执行loop指令的下一条指令。p指令的指令格式为g 代码段偏移地址
,他将跳到当前代码段和偏移地址组成的指令地址。
注意,无论是使用p指令还是使用g指令,循环都会被执行完成。
同时,汇编语言源程序中,数据不能以字母开头。
Debug和汇编编译器masm对指令的不同处理
- 在汇编源程序中,如果使用指令访问一个内存单元,则在指令中必须用
[]
来表示内存单元于所在段的偏移地址,如果[]
中为一个idata,则需要在其之前显式给出段寄存器。否则将认为idata。 - 如果在
[]
里使用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认存在ds中。当然也可以显式给出段地址所在的段寄存器。
段前缀
出现在访问内存单元的指令中,用于显式指明内存单元的段地址ds:
cs:
ss:
es:
,在汇编语言中称为段前缀。
一段安全的空间
在8086模式中,随意向一段内存空间写入内容式很危险的,因为这段空间中可能存在着重要的系统数据或者代码。
我们实在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。如果我们需要向内存空间中写入数据,应该使用操作系统分配给我们的空间,而不应该随意指定内存单元。
我们在纯DOS方式(实模式)下,可以不理会DOS,直接使用汇编语言去操作真实的硬件,因为运行在cpu实模式下的DOS没有能力对硬件系统进行全面、严格的管理。但在运行在cpu保护模式下的系统中,不理会操作系统,用汇编语言去操作真实的硬件是不可能的,因为硬件已经被这些操作系统利用cpu保护模式所提供的功能全面而严格地管理了。
一般pc机中,dos方式下,dos和其他合法程序都不会使用0:200~0:2ff的256个字节空间。