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

それは素晴らしい働きをします。しかし、1つの問題があります。行int09hを変更すると

mov ah,01h  
int 21h 

また、「X」を出力しますが、その後プログラムがハングします(ms-dosも)。どうすれば修正できますか?

4

2 に答える 2

2

シンプルであるほど良い。

たとえばAH=01hの場合、MS-DOSの21h割り込みを使用する方がはるかに簡単です。

int 9は、キーボードのスキャンコードで機能する低レベルの割り込みのようです。これは、キーの押下とキーのリリースを区別する必要があることを意味します。

于 2011-04-23T17:32:26.977 に答える
1

これは見た目ほど単純ではありません。コンソールに出力するには、システムコールが必要です。必要なシステムコール(write())は、割り込みハンドラから呼び出すことはできません。

これが実行される環境に応じて、さまざまなシステムコールがこの使用法を対象としています。たとえば、Linuxでは、kprintf()メッセージをシステムログファイルにキューイングするために使用されます。このログファイルは、最終的にシステムコンソールに表示される場合があります。

TASMを使用しているので、おそらくMSDOSで実行していますか?その場合、メモリ内の正しい位置にバイトを書き込むことにより、画面のテキストバッファに直接書き込むことができます。ただし、これには現在のカーソル位置などの管理が必要です。許容できるコンソールディスプレイを決定する必要があります。または、誰かがすでにあなたに言っているかもしれません。

于 2011-04-23T17:14:10.057 に答える