. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  一个奇怪的问题:编写书本例题"int 9中断例程"遇到的问题  [已解决] 回复[ 5次 ]   点击[ 341次 ]  
grc10010010
[帖 主]   [ 发表时间:2011-12-19 17:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
书上P280页编写int 9中断例程中,用如下代码保存原来的int 9中断例程的入口地址: 
push es:[9*4] 
pop  ds:[0] 
push es:[9*4+2] 
pop ds:[2] 
最后又用如下代码恢复了原int 9中断例程的入口地址: 
push ds:[0] 
pop es:[9*4] 
push ds:[2] 
pop es:[9*4+2] 
问题是,此处使用了栈,为什么不能直接用如下代码将原地址压栈: 
push es:[9*4] 
push es:[9*4+2] 
再用如下代码出栈: 
pop es:[9*4+2] 
pop es:[9*4] 
事实上在我修改了代码后再运行程序是不能得到预期的效果的,这是为什么呢?
tomato
[第1楼]   [ 回复时间:2011-12-19 22:51 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
楼主再自己看看书中的那几条指令和自己写的指令,执行的过程可是完全不一样啊!
grc10010010
[第2楼]   [ 回复时间:2011-12-20 09:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
我是这样理解的:
如果按我改写的代码的思路,那么书中栈的使用情况是这样的:
1、原中断例程入口地址入栈:
push es:[9*4]
push es:[9*4+2]
2、call delay时inc ah的IP入栈;
3、delay子程序中栈的使用情况:
push ax
push dx
pop dx
pop ax
ret后返回inc ah处执行代码。
4、因为ret后IP出栈,所以此时栈顶应指向最先入栈的原中断例程入口地址处,再使用如下指令将其恢复:
pop es:[9*4+2]
pop es:[9*4]
5、如果执行程序的过程中按下了ESC键,则调用新int 9中断例程,其中栈的使用情况如下:
(1)按下ESC键后引发9号中断过程,标志寄存器入栈,CS、IP入栈;
(2)执行中断例程:
     push ax
    push bx
    push es
    pushf
    此处将标志寄存器IF、TF置0的代码省略;
    call dword ptr ds:[0]指令时后一条代码的CS、IP入栈;
    调用原来的int 9中断例程;
    在原来的int 9中断例程中应该有返回(出栈)上一条call指令时入栈的CS、IP;
    cmp al,1指令判断是否按下ESC键,如果按下改变颜色后恢复寄存器,否则直接恢复寄存器,并用iret还原进入新int 9中断例程前的现场。

从上面栈的使用情况来看,好像没有什么不对的地方啊...

另外1楼所说的"执行过程不一样"是指什么?能否解释得详细些...
tomato
[第3楼]   [ 回复时间:2011-12-20 22:22 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
楼主认真看一下call dword ptr ds:[0]这条指令是干什么的?它就是要调用原来的int9中断,因为原来的int9中断地址之前已经存放到ds:[0]处了,而楼主改后的是存放到栈中,如果我要调用原来的int9中断,是不是就找不到了?楼主是否想过这个问题?
grc10010010
[第4楼]   [ 回复时间:2011-12-21 07:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
嗯,是这样的,我明白了,谢谢你!
grc10010010
[第5楼]   [ 回复时间:2011-12-21 07:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
此贴由 贴主 于 [ 2011-12-21 07:31 ] 结贴。 结贴原因:问题已解决
得分情况: 3楼(tomato):8分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved