. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  书中第15.5节一道例题的疑问?  [待解决] 回复[ 13次 ]   点击[ 1030次 ]  
superasm
[帖 主]   [ 发表时间: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
lion
[第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号中断,因为段地址还没有设置,所以转去一个错误的地址。程序出错。
mark0289
[第2楼]   [ 回复时间:2008-06-06 21:42 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2008-05-12 16:27
我觉得这儿的高手好多
qiushuo888
[第3楼]   [ 回复时间:2009-02-10 15:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-10 11:39
我刚好也有这个疑问,谢谢大虾指教
mouse
[第4楼]   [ 回复时间:2009-02-18 15:45 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
书上15.4提到了,涉及到键盘的程序,要访问真实硬件,要到实dos下做。否则可能会有与实验不符的想象。
hsiaogiant
[第5楼]   [ 回复时间:2009-03-25 11:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-12 16:20
谢谢lion及mouse,我的困惑也得到解答了~~
378499835
[第6楼]   [ 回复时间:2009-05-29 09:57 ]   [引用]   [回复]   [ top ] 
荣誉值:11
信誉值:1
注册日期:2008-11-24 20:35
受教了
sinawear
[第7楼]   [ 回复时间:2009-06-18 02:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
我认为lion解释的不对.
为什么不对?因为我在执行设置中断例程的偏移地址时就发生了错误.而不是
=======================================================================
第一条设置9号中断的偏移地址的指令之后,还没有设置段地址,这时产生了新的键盘输入调用9号中断,因为段地址还没有设置,所以转去一个错误的地址。程序出错
=======================================================================
我的解释是什么呢?
答:我也没想到为什么.
ndxhoubin
[第8楼]   [ 回复时间:2009-10-19 17:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-11-29 19:08
第二个问题我理解了,第一个问题,我还在郁闷中,我用F1的通码,可是我按了N久他大爷的,鸟都不出一个,结果我使用断码,一下就过,直接晕到家,这是为什么,各位老大
yoyobehappy
[第9楼]   [ 回复时间:2009-12-17 10:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-17 10:24
受教了!!!!谢谢!!!!!
xhz520
[第10楼]   [ 回复时间:2010-02-18 06:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-21 15:36
受教了。之前我也一直用CMD的窗口。到了这里才发觉不对。呵呵。
guanchun
[第11楼]   [ 回复时间:2010-04-22 10:58 ]   [引用]   [回复]   [ top ] 
荣誉值:11
信誉值:0
注册日期:2010-04-22 09:56
第二个问题(通过debug 追踪,却无法运行修改int   9h中断例程入口地址的指令,debug提示该指令无效。):   因为如果单步执行的话,当执行完第一条设置9号中断的偏移地址的指令之后,还没有设置段地址,这时产生了新的键盘输入调用9号中断,因为段地址还没有设置,所以转去一个错误的地址。程序出错。


这个问题LION的解释感觉有问题,因为我们已经cli了,此时不会响应9号中断啊?
anuya
[第12楼]   [ 回复时间:2010-09-30 10:38 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-09-13 18:17
因为你是松开a健时才显示,所以应该用断码
lmnchina
[第13楼]   [ 回复时间:2012-11-10 02:22 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2011-04-05 00:08

需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved