0


我需要在汇编程序(TASM)上编写一个程序。当按下任何按钮时,它应该在控制台上写一条消息。
它应该是 int 9h 处理程序!
那么如何为我自己的处理程序更改标准键盘处理程序:

keyboardhandler proc  
  mov ah,9  
  mov dx,offset myMsg
  int 21h
  iret
keyboardhandler endp

越简单越好。谢谢你。

===============================================
所以我有什么现在...有一个程序

.model small
.386
.stack 100h

.data
old9 dd ?

.code

start:
mov ax,@data
mov ds,ax
mov es,ax
jmp setup

prg proc
  mov ah,2
  mov dl,'X'
  iret
prg endp

setup:

  cli
  mov ax,0h
  mov es,ax
  mov bx,es:[9*4]
  mov word ptr old9,bx
  mov bx,es:[9*4+2]
  mov word ptr old9+2,bx
  mov word ptr es:[9*4],offset prg
  mov es:[9*4+2],cs
  sti

  int 09h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; this one

  lds dx,dword ptr old9
  mov ax,2509h
  int 21h

  mov ax,4c00h
  int 21h
end start

它工作得很好。但是有一个问题。当我将行 int 09h 更改为

mov ah,01h  
int 21h 

它还会打印我的“X”,但在该程序挂起之后(以及 ms-dos 也是如此)。我该如何解决?

4

2 回答 2

2

越简单越好。

使用 MS-DOS 的 21h 中断会简单得多,例如使用AH = 01h

int 9 似乎是与键​​盘扫描代码一起使用的较低级别的中断。这意味着您必须区分按键和按键释放。

于 2011-04-23T17:32:26.977 回答
1

这并不像看起来那么简单。为了输出到控制台,需要一个系统调用。write()不允许从中断处理程序调用所需的系统调用 ( )。

根据它运行的环境,不同的系统调用适用于此用途。例如,在 Linux 下,kprintf()用于将消息排队到系统日志文件中,最终可能会显示在系统控制台上。

由于您使用的是 TASM,可能您正在 MSDOS 上运行?在这种情况下,您可以通过在内存中的正确位置写入字节来直接写入屏幕文本缓冲区。但是,这需要对当前光标位置等进行一些管理。你必须决定——或者也许有人已经告诉过你——什么是可接受的控制台显示。

于 2011-04-23T17:14:10.057 回答