![]() | 第10章 细节补充 | -287- | |||||||||||||||||||
0F6A:0105 int 3 0F6A:0106 [Enter] |
|||||||||||||||||||||
-u100 105 0F6A:0100 0F6A:0103 0F6A:0105 |
[Enter] B8070E CD10 CC |
MOV INT INT |
AX,0E07 10 3 |
||||||||||||||||||
从反汇编的的结果可以看出"INT 3"与一般的INT指令的区别:指令"INT 10"编译成的机器码是"CD 10",很明显,"10"就是中断号,"CD"是INT指令的机器码。照此来看"INT 3"应该编译成"CD 03"才对,然而反汇编的结果显示出"INT 3"的机器码只有一个字节--0CCH。所以说"INT 03"实际是一条单字节中断指令,尽管形式上它与"INT 10"之类的指令一致。 这条指令有什么作用呢?我们不妨把这个程序运行一下,看看会有什么结果产生。 |
|||||||||||||||||||||
-g=100[Enter] | |||||||||||||||||||||
AX=0E07 | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0F6A | ES=0F6A | SS=0F6A | CS=0F6A | IP=0105 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
0F6A:0105 | CC | INT 3 | |||||||||||||||||||
除了喇叭里发出一声鸣叫之外,屏幕上居然显示出了所有寄存器的内容。我们既没有用R命令观察寄存器,也没有用T、P命令跟踪这个程序的执行,屏幕上所显示的这些东西又是从何而来呢? 问题的答案是很有戏剧性的:我们在0105处打了一个断点。 3号中断其实是专为DEBUG提供的,DEBUG内部包含有3号中断的服务程序,启动DEBUG之后它会修改中断向量表,使3号中断向量指向DEBUG内部的服务程序。这段服务程序的作用就是将所有寄存器的内容显示在屏幕上并等待命令。所谓设置断点,实际过程就是DEBUG将断点地址处的一个字节取出存入它自己的数据区内,然后在断点地址处填入0CCH。这样当程序执行到断点地址处就会产生3号中断,于是我们就能观察到各个寄存器的内容。在上面的实验程序中,我们人为地在0105处输入了指令INT 3,作用等同于打上一个断点。 这样来看有关DEBUG程序的"T"命令与"G"命令的详细情况我们已略知一二,"T"命令主要依靠单步中断,可以通过设置标志寄存器的TF位实现;而"G"命令设置断点主要依靠单字节中断指令"INT 3"。必须注意,"P"命令虽然功能与"T"命令相似,但是"P"命令也是依靠"INT 3"实现,它不依靠单步中断。 (6)指针处理指令 指针的概念在前面的章节里已有所讲述,这个词诈听上去有些悬妙,其实要用最明确的话来说,指针就是数据在内存中的地址。这个地址可以是单纯的16位偏移地址,也可以是32位的"段:偏移"形式。 我们前面编制的许多程序中都应用了"OFFSET"这个分析运算符,实际上这个分析符起的作用就是用于取得指向数据块首的指针。但是使用"OFFSET"并非是唯一的方法,请看下面的程序所指出的另一条途径: |
|||||||||||||||||||||
WWW.ASM data |
segment assume |
ds:data |
|||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |