第五—八章 [bx]和loop指令

        在实际编程中,经常会遇到用同一种方法处理地址连续的内存单元中的数据的问题。我们需要用loop循环来解决这类问题,同时我们必须能够在每次循环的时候按照同一种方法来改变要访问的内存单元的地址。这时,就不能用常量来给出内存单元的地址,而应用变量。mov al,[bx]中的数值,改变指令访问的内存单元。

        指令 mov ax,[bx]中,内存单元的偏移地址由bx给出,而段地址默认在ds中。我们可以在访问内存单元的指令中显示地给出内存单元的段地址所在的段寄存器。不要忘记我们是在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。如果我们需要向内存空间写入数据的话,要使用操作系统给我们分配的空间,而不应直接用地址任意指定内存单元,向里面写入。但是同样不能忘记。我们正在学习的是汇编语言,要通过它来获得底层的编程体验,理解计算机底层的基本工作原理。所以我们尽量直接对硬件编程,而不去理会操作系统。

        我们似乎面临一种选择,是在操作系统中安全规矩地编程,还是自由直接地用汇编语言去操作真实的硬件,了解那些早已被层层系统软件掩盖的真相,在大部分情况下,我们选择后者,除非我们就是在学习操作系统本身的内容。我们在纯DOS环境下,可以不理会DOS,直接用汇编语言去操作真实的硬件,因为运行在CPU实模式下的DOS,没有能力对硬件系统进行全面,严格地管理。硬件已经被这些操作系统利用CPU保护模式所提供的功能全面而严格的管理了。

        我们需要直接向一段内存中写入内容,这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误。DOS方式下,一般情况 0:200~0:2ff 空间中没有系统或其他程序的数据或代码。在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用“[···]”来表示内存单元,如果在“[]”里用一个常量idate直接给出内存单元的偏移地址,就要在“[]”的前面显式地给出段地所在的段寄存器。如果在“[]”里用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认在ds中。当然,也可以显式地给出段地址所在的段寄存器。

        执行loop指令时,要进行两步操作:1)(cx)=(cx)-1;2)判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。用cx和loop指令相配合实现循环功能的3个要点:1.在cx中存放循环的次数;2.loop指令中的标号所标识地址要在前面; 3.要循环执行的段程序,要写在标号和loop指令之间。将循环一次执行完,可以使用p命令来达到目的。DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码,我们需要向一段内存中写入内容时,就使用0:200~0:2ff这段空间。si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。用16位寄存器进行内存单元之间的数据传送,一次复制2个字节,一共循环8次。我们用db和dw定义字节型数据和字型数据。dd是用来定义双字型数据的。dup是一个操作符,用来进行数据的重复。

posted @ 2018-12-10 10:56  沈筱月  阅读(214)  评论(0编辑  收藏  举报