目录 上一页 下一页 下一章

第3章 中断调用与子程序 -33-

-t注意AX寄存器的变化
AX=20CDBX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=09FEES=09FESS=09FECS=09FEIP=0103 NV UP EI PL NZ NA PO NC
09FE:0103B80000MOV AX,0000
  执行指令之后AX寄存器是20CD,这个数来自于存储器。
-t注意AX寄存器的变化
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=09FEES=09FESS=09FECS=09FEIP=0103 NV UP EI PL NZ NA PO NC
09FE:0106BAA682MOV DX,82A6
  指令"MOV AX,0000"中的0000没有加"[]",结果这个0000被送入了AX寄存器。
  这个实验很好地说明了"[ ]"的作用。回忆我们上一章所讲的"寻址方式"的概念,自然会明白这里又出现一种新的寻址方式,我们把这种寻址方式称为"直接寻址"。
  这种寻址方式适合从内存中取得单一的数据。设想如果我们需要从内存中连续取得多个数据,那么用直接寻址方式就需要写出很多指令,这是很不方便的。于是便引出了"间接寻址"的概念。
  间接寻址与直接寻址的区别就在于间接寻址方式中的偏移地址并不出现在"[ ]"中,而是放在一个寄存器中,而这个寄存器被"[ ]"括了起来。在程序PROG-3中,指令MOV BX,102把那串文字的"首地址0102H"放入BX寄存器,那么指令MOV DL,[BX]的含义也就很清楚了,当BX寄存器为102H时,此指令等同于MOV DL,[102],它执行的结果将使DL中出现"P"的ASCII码──50H,当BX寄存器变成103H时,此指令就相当于MOV DL,[103],它执行的结果将使DL中出现"r"。
  和直接寻址相比,间接寻址的优势在于置入寄存器中的地址可以通过运算加以改变。我们可以把含有地址的寄存器想象成一个"指针",它指向内存中的某一个单元,若我们改变了这个寄存器中的数据,则这个指针就会指向其它单元,配以"[ ]",我们就可以很方便地取得内存中任意位置的数据。
  除此之外,PROG-3中还有一些值得注意的东西:
① 用02功能输出0DH、0AH时,屏幕上并未出现对应的ASCII字符。原因在于0DH、0AH是控制码,02功能将它们解释成"回车"和"换行",输出这两个控制码将使光标移到下一行的最左端,所以第二个"a"打印在第二行。
② 此程序的缺点是仅能输出16个字母的文字串,不能输出任意长度的文字串。PROG3-A和PROG3-B对这个缺点作了改进。
PROG3-A
-a100[Enter]
09FE:0100 jmp 111
09FE:0102 db'Hello,World!',0d,0a,0
09FE:0111 mov bx,0
;跳过字符串数据区
;定义一个字符串,结尾为0
;初始化BX寄存器为0

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章