|
主题 : : 书中第15.5节一道例题的疑问? [待解决] |
回复[ 13次 ]
点击[ 1030次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-06-25 18:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-06-22 20:13 |
书中第15.5节中的那道关于扩展int 9h中断例程的例题。源码如下(见书中272页)。书中描述这一程序的功能是:在DOS下,按F1键改变当前屏幕的显示颜色,其他的键照常处理。
但是我编译运行这一程序后却发现按F1键屏幕显示颜色完全没有改变。新的中断例程似乎没有装进去。而且奇怪的是这个程序直接运行可以,但是通过debug 追踪,却无法运行修改int 9h中断例程入口地址的指令,debug提示该指令无效。(见下面源码中***处)。这到底是怎么回事?有没有大虾运行过这个程序?是书中给出的源码有错误吗?
assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 128
push cs
pop ds
mov ax, 0
mov es, ax
mov si, offset int9 ;设置ds:si指向源地址
mov di, 204h ;设置es:di指向目的地址
mov cx, offset int9end-offset int9 ;设置cs为传输长度
cld ;传输方向为正
rep movsb ;将新的int 9h中断例程入到0:[204h]处
push es:[9*4] ;将原来的int 9h中断例程入口的
pop es:[200h] ;偏移地址保存到0:[200h]处
push es:[9*4+2] ;将原来的int 9h中断例程入口的
pop es:[202h] ;断地址保存到0:[202h]处
cli
mov word ptr es:[9*4], 204h ;(*** debug中无法运行此指令)将int9h中断例程的
mov word ptr es:[9*4+2], 0 ;(*** debug中无法运行此指令)入口地址修改为0:[204h]
sti
mov ax, 4c00h
int 21h
int9:
push ax
push bx
push cx
push es
in al, 60h
pushf
call dword ptr cs:[200h] ;调用原来的int 9h中断例程
cmp al, 3bh ;F1的扫描码为3bh
jne int9ret
mov ax, 0b800h
mov es, ax
mov bx, 1
mov cx, 2000
s:
inc byte ptr es:[bx]
add bx, 2
loop s
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9end:
nop
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-07-24 21:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:33
信誉值:0
注册日期:2007-07-10 11:31 |
先回答你第一个问题(按F1键屏幕显示颜色完全没有改变):
你可能是从开始-运行-cmd 进入了cmd.exe运行的这个程序,正确的应该是从开始-运行-Command.com进入Command.com运行,则不会有问题。
command.com是ms-dos的应用程序,(严格地说,是内部命令处理程序)是所有内部命令的集合,调入内存后可以接受键入的内部命令,并按照dos的规定的功能执行命令,cmd.exe是基于windows系统运行的程序,只是为习惯dos操作提供的一个命令提示符窗口。
cmd下会恢复一些用户已经更改的中断向量。Command.com下不恢复。
第二个问题(通过debug 追踪,却无法运行修改int 9h中断例程入口地址的指令,debug提示该指令无效。): 因为如果单步执行的话,当执行完第一条设置9号中断的偏移地址的指令之后,还没有设置段地址,这时产生了新的键盘输入调用9号中断,因为段地址还没有设置,所以转去一个错误的地址。程序出错。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-06-06 21:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2008-05-12 16:27 |
|
|
|
|
|
[第3楼]
[ 回复时间:2009-02-10 15:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-10 11:39 |
|
|
|
|
|
[第4楼]
[ 回复时间:2009-02-18 15:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34 |
书上15.4提到了,涉及到键盘的程序,要访问真实硬件,要到实dos下做。否则可能会有与实验不符的想象。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-03-25 11:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-12 16:20 |
谢谢lion及mouse,我的困惑也得到解答了~~ | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-05-29 09:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:11
信誉值:1
注册日期:2008-11-24 20:35 |
|
|
|
|
|
[第7楼]
[ 回复时间:2009-06-18 02:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31 |
我认为lion解释的不对.
为什么不对?因为我在执行设置中断例程的偏移地址时就发生了错误.而不是
=======================================================================
第一条设置9号中断的偏移地址的指令之后,还没有设置段地址,这时产生了新的键盘输入调用9号中断,因为段地址还没有设置,所以转去一个错误的地址。程序出错
=======================================================================
我的解释是什么呢?
答:我也没想到为什么. | | |
|
|
|
|
[第8楼]
[ 回复时间:2009-10-19 17:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-11-29 19:08 |
第二个问题我理解了,第一个问题,我还在郁闷中,我用F1的通码,可是我按了N久他大爷的,鸟都不出一个,结果我使用断码,一下就过,直接晕到家,这是为什么,各位老大 | | |
|
|
|
|
[第9楼]
[ 回复时间:2009-12-17 10:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-12-17 10:24 |
|
|
|
|
|
[第10楼]
[ 回复时间:2010-02-18 06:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-01-21 15:36 |
受教了。之前我也一直用CMD的窗口。到了这里才发觉不对。呵呵。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2010-04-22 10:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:11
信誉值:0
注册日期:2010-04-22 09:56 |
第二个问题(通过debug 追踪,却无法运行修改int 9h中断例程入口地址的指令,debug提示该指令无效。): 因为如果单步执行的话,当执行完第一条设置9号中断的偏移地址的指令之后,还没有设置段地址,这时产生了新的键盘输入调用9号中断,因为段地址还没有设置,所以转去一个错误的地址。程序出错。
这个问题LION的解释感觉有问题,因为我们已经cli了,此时不会响应9号中断啊? | | |
|
|
|
|
[第12楼]
[ 回复时间:2010-09-30 10:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-09-13 18:17 |
|
|
|
|
|
[第13楼]
[ 回复时间:2012-11-10 02:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2011-04-05 00:08 |
|