. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  求教15章的一个问题  [待解决] 回复[ 2次 ]   点击[ 587次 ]  
loveasm
[帖 主]   [ 发表时间:2007-06-22 21:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-06-22 21:18
15章有个实验:屏幕中间依次显示‘a’~‘z’,显示过程中,按下Esc键后,改变显示颜色。
思路是:改变number 9的中断向量表,调用新的中断处理,在新的中断处理过程中,又要调用原来的INT9中断处理,现在迷惑的地方是,我认为应该在调用原来的中断处理时有字符在屏幕显示,即,程序运行当中,当我敲击可以显示的字母键时比如说a,应该有a在屏幕上显示,但是实际上只有屏幕中间的‘a’~‘z’的字母在闪现。
希望哪位明白人指点一下代码如下:
assume cs:codestack 
       segment db 128 dup (0)
       stack ends 
      data segment 
        dw 0,0data 
        endscode 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:[9*4]
         pop ds:[0]
         push es:[9*4+2]
         pop ds:[2]
         cli
         mov word ptr es:[9*4],offset 
         int9
         mov es:[9*4+2],cs
         sti
         mov ax,0b800h
         mov es,ax
         mov ah,'a'
      s: mov es:[160*12+40*2],ah
         call delay
         inc ah
         cmp ah,'z'
         jna s
         mov ax,0
         mov es,ax
         push ds:[0]
         pop es:[9*4]
         push ds:[2]
         pop es:[9*4+2]
         mov ax,4c00h
         int 21h
     delay:
         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
   int9: push ax
         push bx
         push es
         in al,60h
         pushf
         pushf
         pop bx
         and bh,11111100b
         push bx
         popf
         call dword ptr ds:[0]
         cmp al,1
         jne 
         int9
         ret
         mov ax,0b800h
         mov es,ax
         inc byte ptr es:[160*12+40*2+1]
         int9
         ret:
         pop es
         pop bx
         pop ax
         iret 
   code ends
        end start
lion
[第1楼]   [ 回复时间:2007-07-25 15:11 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2007-07-10 11:31
比如:在Command.com下,你敲击的字母会显示到屏幕上,那是因为Command.com这个程序在不停地读键盘缓冲区,读到了如果是字符就回显到屏幕上,它程序内部就是这样处理的,而在运行上面的程序的时候Command.com将Cpu的控制权交给了你的程序,你的按键只是通过键盘中断程序放到了键盘缓冲区,并没有将它读出来并显示到屏幕上,你的程序没有这样处理,所以不会显示,你不要认为计算机在任何情况下都会显示键盘的输入,那只是程序设计成那样了,程序内部有读键盘缓冲区并显示到屏幕指定位置这样的指令集合。
yp12000
[第2楼]   [ 回复时间:2009-04-19 14:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-14 20:10
建议暂时搁置这个问题,等看了第17章第3节 就明白了
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved