|
主题 : : 281页关于esc改变屏显颜色的新in9程序不太理解。。 [待解决] |
回复[ 10次 ]
点击[ 649次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-02-03 15:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
我是这么想的,当按下esc键,扫描码1被送到60端口,然后产生了in9中断,但是新in9程序只做了一件事,就是
cmp al,1比较是否按入的是esc键,那么只要一个命令 in al,60h,把扫描码放入al中就可以了,何必去调用原来的in9呢?
在程序的开头就就有这个命令,然后再去调用原有in9,就算要调用,那么开头的in al,60h还有必要吗?因为原来的in9中就有扫描码放入al的指令啊,越看越糊涂了。。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-02-03 20:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:1
注册日期:2009-12-24 11:13 |
|
|
|
|
|
[第2楼]
[ 回复时间:2010-02-03 20:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37 |
|
|
|
|
|
[第3楼]
[ 回复时间:2010-02-04 13:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
ssume cs:code
stack segment
db 128 dup(0)
stack ends
data segment
dw 0,0
data ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
mov ax,0
mov es,ax
push es:36
pop ds:[0]
push es:[38]
pop ds:[2]
cli
mov word ptr es:[36],offset int9
mov es:[38],cs
sti
mov ax,0b800h
mov es,ax
mov ah,'a'
s: mov es:[160*12+40*2],ah
call deplay
inc ah
cmp ah,'z'
jna s
mov ax,0
mov es,ax
push ds:[0]
pop es:[36]
push ds:[2]
pop es:[38]
mov ax,4c00h
int 21h
deplay: push ax
push dx
mov dx,1000h
mov ax,0
s1: sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
上面照抄,因为怕出问题,就什么都没改
这下面是in9改的
int9:push ax
push bx
push es
in al,60h
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
add byte ptr es:[160*12+81],5
int9ret:pop es
pop bx
pop ax
code ends
end start | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-02-04 13:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
结果是:程序运行后,按下esc键,字母红色显示,这里看起来到正常。可程序结束后,原in9地址没变,回到dos,无法再输入
如果程序运行后,按下其它键,想再按esc键,就没反应,按理解,应该是随时按就该有反应的
而且 一样,原in9地址也没回去
确实是有问题 | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-02-04 13:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
上面最后少了iret,源文件是有的,但是还没搞明白为什么会这样, | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-02-04 16:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
只能这么理解,键盘输入的处理是一个比较复杂的过程,只要有输入,就得调用这个程序,如果不调用,就会出错:) | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-03-05 14:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-09-08 11:48 |
原来的int9中断程序也是有栈保护寄存器的,所以开始的in al,60h 不被调用原来的int9覆盖掉的,至于这里为什么要调用原来的int9呢,书本不是说了吗?不全部研究9号中断的全部,只修改一部分,硬件细节处理步骤交由原int9处理。
不过楼主讲的这个程序应该可以不调用原int9 .原中断int9的功能书本也描述到了! | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-03-07 08:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-01 22:24 |
|
|
|
|
|
[第9楼]
[ 回复时间:2010-11-04 16:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-16 19:16 |
同问,我们编写的新int9程序中,为什么要模拟int指令啊?(就是指标志寄存器入栈,tf=0,if=0)
这些不是硬件完成的吗?
可能是我前面没学好,求解释。。。 | | |
|
|
|
|
[第10楼]
[ 回复时间:2011-03-18 22:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-03 21:13 |
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,0b800h
mov ds,ax
mov si,160*8+12
mov ax,stack
mov ss,ax
mov sp,16
mov dh,2
mov dl,'a'
suru:in al,60h ;按住ESC变绿放开变红色
cmp al,1h
jne jx
mov dh,2
jx:cmp al,81h
jne jx1
mov dh,4
jx1:mov [si],dx
call yansi
inc dl
add si,2
cmp dl,'z'
jna suru
mov ax,4c00h
int 21h
yansi: push dx ;子程序停1秒
push ax
mov dx,1fffh
mov ax,0
s:sub ax,1
sbb dx,0
cmp ax,0
jne s
cmp dx,0
jne s
pop ax
pop dx
ret
code ends
end start | | |