|
发表于 2020-3-28 20:45:01
|
显示全部楼层
> 转.com文件的问题,已经成功,但奇怪,我的源程序中包含了
> mov word ptr old_print[2],es ; 段地址
> 也成功转换了啊
不是说 .com 文件中不能使用 es 这样的段寄存器, 而是不能引用自己程序段的段址. 这是因为程序段的段址, 由于程序被加载到内存中时, 由于起始地址的不同, 也会有不同. 所以, dos 会根据加载的基址对其调整, 使其引用正确. 这个就是所谓的 exe 程序的重定位. com 文件就没有重定位项, 所以也不能有对段的引用. 其它方式对段寄存器的使用都是可以的. 比如:
mov ax, 0b800h
mov es, ax
上面的那个代码, 是有个问题:
new_print proc far ;新的中断服务程序入口
assume cs:cseg,ds:cseg
STI
pushf
assume ds:nothing
push ax
push dx
mov al,'M'
mov ah,0
mov dx,0
pushf ;*+ 需用这个指令. 如同 int17h 一样, 标记寄存器需用压栈的
call dword ptr old_print
pop dx
pop ax
popf
NOP
IRET
new_print endp
另外, 这个代码的驻留功能是正常的吧. 我在 xp 的 dos 窗口下直接运行了, 再进 debug 查看 0:5c 处的 int17h 的中断向量, 是指向这段代码的.
不过, 看过你的另外的帖子, 要求以此修改打印的内容. 这个, 恐怕不能这么实现的. 一般来说, 打印功能, 通过 int17h 来发送数据的, 可能比较少吧, 还是直接传送到打印端口比较有效率. 所以, 通过拦截 int17h 可能难以达到原来设想的目的 |
|