-300- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
code |
mov mov mov mov int mov int ends end |
word ptr [old09],bx word ptr [old09+2],es ax,2509h dx,offset new09 21h dx,offset install 27h start |
;将原09H中断向量存入内存 ;设置新的09H中断向量 ;结束并驻留内存 |
||||||||||||||||||
将这个程序编译连接成COM文件,运行之后就会发现键盘的工作与原先一模一样,唯一的不同就是F11和F12这两个功能键有作用了。其实这个程序并没有什么特殊的技术,我们只不过是采用了DOS提供的35H功能预先取得了原09H中断服务程序的入口地址,并将其保存在一个双字的数据区内: | |||||||||||||||||||||
![]() |
功能号:35H 用 途:取得某个中断服务程序的入口地址 参 数:AH=35H AL=中断号 调 用:INT 21H 返 回:ES=中断服务程序入口段地址 BX=中断服务程序入口偏移地址 |
||||||||||||||||||||
注意一下程序中取代"IRET"的指令"JMP DWORD PTR CS:[OLD09]",我们前面讲过许多应用于MOV等数据传送指令的寻址方式同样适用于JMP、CALL等转移指令,在这个程序中指令JMP可看作是应用了"存储器直接寻址"方式完成"远程"转移。关于这个指令有三个关键之处: ① 注意PTR操作符前的"类型"是"DWORD(Double WORD)",不要想当然地写成"WORD PTR"或"FAR PTR"。写成"WORD PTR"指令本身并没错,但是它不能完成"远程"转移。至于"FAR PTR"则是完完全全的不对。 ② 注意明确指定段寄存器是CS,因为原服务程序入口地址和新编的中断服务程序代码是在一个段内,而CPU进入中断服务程序后只有CS寄存器指向这个段,其它段寄存器还都是被中断的程序设置的值。 ③ 注意预先保存原中断服务程序入口地址时要把偏移地址放在低字位置,段地址放在高字位置。 (2)05H中断 严格地说这个中断并不是一个硬件中断,尽管这个中断是由[PrtSc]键激发的。实际上这个中断是由09H中断服务程序调用而产生,当[PrtSc]键按下之后,09H中断服务程序检测到键盘发出的扫描码是[PrtSc]键,它就会执行一条"INT 05"指令,从而产生05H中断。 系统为05H中断提供的服务程序可以将屏幕上显示的内容输出到打印机,完成屏幕的"硬拷贝"。很多抓图程序都是通过重编05H中断服务程序的方法实现其功能,我们下面给出的程序就是通过这种方法实现"拷屏"的: |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |