-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=01B1 | BX=0103 | CX=0004 | DX=1B00 | SP=FFFE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0E69 | ES=0E69 | SS=0E69 | CS=0E69 | IP=0120 | OV UP EI PL NZ NA PO CY | ||||||||||||||||
0E69:0120 | E80200 | CALL 0125 | |||||||||||||||||||
利用"G"命令控制程序执行到0E69:0120处停下,以便于观察CALL指令的执行情况。注意当程序等待键盘输入时敲一下"ESC"键。 | |||||||||||||||||||||
-t | |||||||||||||||||||||
AX=01B1 | BX=0103 | CX=0004 | DX=1B00 | SP=FFFC | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0E69 | ES=0E69 | SS=0E69 | CS=0E69 | IP=0125 | OV UP EI PL NZ NA PO CY | ||||||||||||||||
0E69:0125 | 240F | AND AL,0F | |||||||||||||||||||
用"T"命令跟踪CALL指令,可以看到CPU转至0E69:0125处执行,此时我们可以观察一下存入堆栈中的返回地址: | |||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |