目录 上一页 下一页 下一章

-92- PC机汇编语言实战精解




main
code

mov
int
ret
endp
ends
end
ah,2
21h



main


;① 返回LOW4B处,② 返回操作系统



  这个程序由前面的TESTKEY.ASM变化而得,和它的"祖先"相比这个程序显得短了一些,它是一个COM文件。我们先来看看新增的"LABEL"伪指令:

LABEL
  这个伪指令提供了一种在程序中定义标号的方法,它的应用格式为:

标号名 LABEL 属性
  以前我们一直都是在指令前直接加带冒号的标号,象上面程序中的"START:",和"LOW4B:"等,那么用LABEL伪指令所定义的标号和这些直接给出的标号有什么区别呢?不言而喻,主要的区别就在于LABEL伪指令可以使所定义的标号具有属性。这属性指示出转移到(或调用)此标号时,是段内还是段间转移。
  我们在这个程序使用LABEL定义了一个名为HEX2ASC标号,这个标号将MAIN过程切割成两部分,程序中的CALLHEX2ASC指令实际是MAIN过程对它自身的一部分进行调用,这次调用将显示出AL寄存器的高4bit,而显示低4bit时程序直接进入了HEX2ASC部分。不难看出程序最后的RET指令被执行了两次,第一次执行使CPU返回到标号"LOW4B:"处继续执行指令,而第二次执行结束了整个进程。下面是用DEBUG跟踪这个程序的过程:
C:\ASM\>DEBUG TESTKEY2.COM[Enter]
-g=100 120[Enter]
AX=01B1BX=0103CX=0004DX=1B00SP=FFFEBP=0000SI=0000DI=0000
DS=0E69ES=0E69SS=0E69CS=0E69IP=0120 OV UP EI PL NZ NA PO CY
0E69:0120E80200CALL 0125
  利用"G"命令控制程序执行到0E69:0120处停下,以便于观察CALL指令的执行情况。注意当程序等待键盘输入时敲一下"ESC"键。
-t
AX=01B1BX=0103CX=0004DX=1B00SP=FFFCBP=0000SI=0000DI=0000
DS=0E69ES=0E69SS=0E69CS=0E69IP=0125 OV UP EI PL NZ NA PO CY
0E69:0125240FAND AL,0F
  用"T"命令跟踪CALL指令,可以看到CPU转至0E69:0125处执行,此时我们可以观察一下存入堆栈中的返回地址:

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章