. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  281页关于esc改变屏显颜色的新in9程序不太理解。。  [待解决] 回复[ 10次 ]   点击[ 649次 ]  
ldlihuanfa
[帖 主]   [ 发表时间: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的指令啊,越看越糊涂了。。
ldllihuanfa
[第1楼]   [ 回复时间:2010-02-03 20:51 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:1
注册日期:2009-12-24 11:13
实在没办法 ,怕只能装个纯dos下去看了。
qiangzi
[第2楼]   [ 回复时间:2010-02-03 20:56 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
我今晚也因为这个郁闷呢
ldlihuanfa
[第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
ldlihuanfa
[第4楼]   [ 回复时间:2010-02-04 13:27 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
结果是:程序运行后,按下esc键,字母红色显示,这里看起来到正常。可程序结束后,原in9地址没变,回到dos,无法再输入
如果程序运行后,按下其它键,想再按esc键,就没反应,按理解,应该是随时按就该有反应的
而且 一样,原in9地址也没回去

确实是有问题
ldlihuanfa
[第5楼]   [ 回复时间:2010-02-04 13:40 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
上面最后少了iret,源文件是有的,但是还没搞明白为什么会这样,
ldlihuanfa
[第6楼]   [ 回复时间:2010-02-04 16:21 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
只能这么理解,键盘输入的处理是一个比较复杂的过程,只要有输入,就得调用这个程序,如果不调用,就会出错:)
p541938340
[第7楼]   [ 回复时间:2010-03-05 14:40 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-09-08 11:48
原来的int9中断程序也是有栈保护寄存器的,所以开始的in al,60h 不被调用原来的int9覆盖掉的,至于这里为什么要调用原来的int9呢,书本不是说了吗?不全部研究9号中断的全部,只修改一部分,硬件细节处理步骤交由原int9处理。
不过楼主讲的这个程序应该可以不调用原int9 .原中断int9的功能书本也描述到了!
easybjy
[第8楼]   [ 回复时间:2010-03-07 08:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-01 22:24
最近也为这个问题所困
752052871
[第9楼]   [ 回复时间:2010-11-04 16:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-16 19:16
同问,我们编写的新int9程序中,为什么要模拟int指令啊?(就是指标志寄存器入栈,tf=0,if=0)
这些不是硬件完成的吗?
可能是我前面没学好,求解释。。。
youguiqing
[第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
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved