обработчик прерываний клавиатуры. ассемблер - PullRequest
0 голосов
/ 23 апреля 2011


Мне нужно написать программу на ассемблере (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 тоже).Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Чем проще, тем лучше.

Будет намного проще использовать 21-часовое прерывание MS-DOS, например, с AH = 01h .

int 9 представляется прерыванием более низкого уровня, которое работает с кодами сканирования клавиатуры. Это означает, что вам придется различать нажатия клавиш и нажатия клавиш.

1 голос
/ 23 апреля 2011

Это не так просто, как может показаться.Для вывода на консоль необходим системный вызов.Необходимый системный вызов (write()) не может вызываться из обработчика прерываний.

В зависимости от среды, в которой это выполняется, для этого использования предназначены различные системные вызовы.Например, в Linux kprintf() используется для помещения в очередь сообщений в файле системного журнала, которые в конечном итоге могут отображаться на системной консоли.

Поскольку вы используете TASM, возможно, вы работаете в MSDOS?В этом случае вы можете записывать непосредственно в экранный текстовый буфер, записывая байты в правильной позиции в памяти.Однако это требует некоторого управления текущей позицией курсора и так далее.Вам придется решить - или, может быть, кто-то уже сказал вам - что является приемлемым дисплеем консоли.

...