. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  也是15.5的模拟int 指令的一些问题  [待解决] 回复[ 7次 ]   点击[ 300次 ]  
soujiro
[帖 主]   [ 发表时间:2009-06-18 12:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-06-18 12:20



push es:[9*4] 
pop ds:[0] 
push es:[9*4+2] 
pop ds:[2]  ;将原来的int 9中断例程的入口地址保存在这两个单元中 

mov word ptr es:[9*4],offset int 9 
mov es:[9*4+2],cs  ;在中断向量表中设置新的int 9中断例程的入口地址 



;新的int 9中断例程 
int 9: push ax 
push bx 
push es 

in al,60h 

pushf 
pushf 
pop bx 
and bh,11111100b 
push bx 
popf 
call dword ptr ds:[0]  ;对int指令进行模拟,调用原来的int 9 


cmp al,1 
jne int9ret 

mov ax,0b800h 
mov es,ax 
inc byte ptr es es:[160*12+40*2+1] 

int9ret:  pop es 
          pop bx 
          pop ax 
          iret 
code ends 
end start 

该题部分要求是按下esc键,改变显示的颜色后返回 

【问题:】 

标志寄存器啊什么的,不是由新的int 9完成设置了吗,然后按下esc键改变颜色的也由 
cmp al,1 
jne int9ret 

mov ax,0b800h 
mov es,ax 
inc byte ptr es es:[160*12+40*2+1] 
这段代码完成了啊? 

那么 为什么还要用这个代码 
call dword ptr ds:[0]  ;调用原来的int 9  呢?

原来的int 9功能是什么啊?



问一下,call dword ptr ds:[0]
这个代码可不可以用push cs,push ip代替?
sinawear
[第1楼]   [ 回复时间:2009-06-18 15:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
============================================================================
标志寄存器啊什么的,不是由新的int 9完成设置了吗,然后按下esc键改变颜色的也由 
cmp al,1 
jne int9ret 

mov ax,0b800h 
mov es,ax 
inc byte ptr es es:[160*12+40*2+1] 
这段代码完成了啊?
============================================================================
答:LZ理解的不正确.这是我的理解,不知道对不对,唉,最近老是有人留言说我算是白学了.我不知道他们是怎么想的.我学的再差也不能白学吧.这样打击人.居心何在呀..
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=19815&kindLevel=1&kindId=33309&postId=37885&readSg=1

============================================================================
那么 为什么还要用这个代码 
call dword ptr ds:[0]  ;调用原来的int 9  呢?
原来的int 9功能是什么啊?
============================================================================
答:我当时的疑问是你怎么知道它能返回来,继续执行.后来,就不问了.
参看我的提问. 没人愿意回答..我当然还是不知道.LZ便知同是天涯沦落人.
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=19815&kindLevel=1&kindId=33309&postId=37985&readSg=1
如还不清楚,可以与我讨论.
sinawear
[第2楼]   [ 回复时间:2009-06-18 15:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
问一下,call dword ptr ds:[0]
这个代码可不可以用push cs,push ip代替?
===========================================
不能.
soujiro
[第3楼]   [ 回复时间:2009-06-18 20:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-06-18 12:20
我现在差不多理解调用原int 9功能了,否则读不出扫描码。【其实书上前面有解释~】
对了,还有个问题
书上还说,用别的指令模拟int 9功能时,不需要取中断类型码。。 
可是,这段代码,如果要调用新的int 9功能,首先要到中断向量表里找到地址,如es:[9*4],es:[9*4+2],它是要首先知道是几号中断,才可以确定是9*4,【否则esc键按下去时,cpu怎么知道下一步做什么呢?解释哈子】 

然后再由 
mov word ptr es:[9*4],offset int 9 
mov es:[9*4+2],cs  
转到新的int 9那里去执行 


为什么书上说不需要取中断码,直接去做push之类的操作呢?它明明要确定es:[9*4],这样的地址啊?
sinawear
[第4楼]   [ 回复时间:2009-06-18 21:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
不需要取中断码,是因为,bios会主动的去es:[9*4],es:[9*4+2].键盘就是调用int 9.明白?
sinawear
[第5楼]   [ 回复时间:2009-06-18 21:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
我现在差不多理解调用原int 9功能了,否则读不出扫描码。
====================================================
理解的完全不对.
in al,60h是读扫描码的.
建议,多看几遍书.
sinawear
[第6楼]   [ 回复时间:2009-06-18 21:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31
说错了,会主动调用BIOS的int 9.
soujiro
[第7楼]   [ 回复时间:2009-06-18 23:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-06-18 12:20
呵呵,也就是说,是要取得中断码的咯

至于我理解错了,O(∩_∩)O~我再啃啃书~
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved