|
主题 : : 也是15.5的模拟int 指令的一些问题 [待解决] |
回复[ 7次 ]
点击[ 300次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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代替? | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-06-18 15:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31 |
|
|
|
|
|
[第2楼]
[ 回复时间:2009-06-18 15:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31 |
问一下,call dword ptr ds:[0]
这个代码可不可以用push cs,push ip代替?
===========================================
不能. | | |
|
|
|
|
[第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],这样的地址啊? | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-06-18 21:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31 |
不需要取中断码,是因为,bios会主动的去es:[9*4],es:[9*4+2].键盘就是调用int 9.明白? | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-06-18 21:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31 |
我现在差不多理解调用原int 9功能了,否则读不出扫描码。
====================================================
理解的完全不对.
in al,60h是读扫描码的.
建议,多看几遍书. | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-06-18 21:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31 |
|
|
|
|
|
[第7楼]
[ 回复时间:2009-06-18 23:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-06-18 12:20 |
呵呵,也就是说,是要取得中断码的咯
至于我理解错了,O(∩_∩)O~我再啃啃书~ | | |