[bx]和loop指令

要完整地描述一个内存单元,需要两种信息:

  1. 内存单元
  2. 内存单元的长度(类型)

在debug中可以直接使用[0]来代替ds:0但是在汇编语言中却不能够直接这样使用。只有两种选择:

  1. 将偏移地址放在bx寄存器,使用[bx]
  2. 加上段前缀

书中使用的约定:

  1. 描述性符号(),该符号标识一个内存地址指向的字/字节空间
  2. 约定符号idata标识常量

loop指令

loop指令的格式是:loop标号,cpu执行loop指令的时候执行两部操作:

  1. (cx)=(cx)-1
  2. 判断cx中的值是否为0,为0则向下执行,否则转向标号处

所以一般cx中存放的即为循环的次数

cx和loop指令配合实现循环功能的要点:

  1. cx中存放循环次数
  2. loop指令中的标号所标识地址要在前面
  3. 要循环执行的程序段要写在标号和loop指令的中间

在debug中跟中使用loop指令实现的循环语句

如果需要直接执行完循环,则使用p执行loop指令,或者使用g指令执行loop指令的下一条指令。p指令的指令格式为g 代码段偏移地址,他将跳到当前代码段和偏移地址组成的指令地址。
注意,无论是使用p指令还是使用g指令,循环都会被执行完成
同时,汇编语言源程序中,数据不能以字母开头

Debug和汇编编译器masm对指令的不同处理

  1. 在汇编源程序中,如果使用指令访问一个内存单元,则在指令中必须用[]来表示内存单元于所在段的偏移地址,如果[]中为一个idata,则需要在其之前显式给出段寄存器。否则将认为idata。
  2. 如果在[]里使用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认存在ds中。当然也可以显式给出段地址所在的段寄存器。

段前缀

出现在访问内存单元的指令中,用于显式指明内存单元的段地址ds: cs: ss: es:,在汇编语言中称为段前缀。

一段安全的空间

在8086模式中,随意向一段内存空间写入内容式很危险的,因为这段空间中可能存在着重要的系统数据或者代码。

我们实在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。如果我们需要向内存空间中写入数据,应该使用操作系统分配给我们的空间,而不应该随意指定内存单元。

我们在纯DOS方式(实模式)下,可以不理会DOS,直接使用汇编语言去操作真实的硬件,因为运行在cpu实模式下的DOS没有能力对硬件系统进行全面、严格的管理。但在运行在cpu保护模式下的系统中,不理会操作系统,用汇编语言去操作真实的硬件是不可能的,因为硬件已经被这些操作系统利用cpu保护模式所提供的功能全面而严格地管理了。

一般pc机中,dos方式下,dos和其他合法程序都不会使用0:200~0:2ff的256个字节空间





原文地址:https://www.cnblogs.com/freesfu/p/11017755.html