1

したがって、私の目標は、ユーザーが で終了する文字列を入力するまで呼び出されたときにハングするサブルーチンを作成し、<return>それを返します(おそらくユーザーが指定したアドレスに書き込むことによって)。

私の問題は、キーボードから個々の文字を取得する最善の方法にあります。私が見たように、3つの方法があります:

  1. キーボードからの割り込みをリッスンし、それらに応答して文字を取得します。これは、 によって実行されるロジックがgetline割り込みハンドラ内にあることを意味し、いくつかの問題を引き起こしているようです。つまり、キーgetlineを押したときの応答としてどのように戻りますか? <return>割り込みハンドラーでは、戻りアドレスが手元にありません。また、割り込みハンドラーに特定のロジックを入れすぎるパターンは、私には...間違っているように思えます...私は低レベルのコーディングに非常に慣れていませんが。

  2. キーを押すためにキーボードを引っ張り続けるだけです。

  3. 押されたすべての文字を循環バッファ (おそらく長さ 1) にロードすることにより、割り込みハンドラで古い 1.1 の動作を実装します。

これらのオプションについて、もう少し見通しがあればいいでしょう。

4

1 に答える 1

1

を呼び出すとgetline、割り込みハンドラーがセットアップされ、入力されたキーがバッファーに追加され、インデックスが更新されます。

次に、バッファの最後に新しい行ができるまでビジーループを開始し、キーボードからの割り込みを無効にします

getline: 
set push B
set push X
;--coming from interrupt dispatch
SET B, buffer ;--address from argument
SET C, bufferlength ;-- from argument
SET PUSH, 0
SET X, SP ;--address of counter
SET A, startKeyInput
INT softwareInterrupt

IAQ 1;--restart interrupts
startloop:
SET A,buffer
ADD A,SP
IFN [A],'\n'
    set PC, startloop ;--busy loop
IFL PEEK, X
    set PC, startloop ;-- stopping buffer overflow
IAQ 0;--stop interrupts
set A, stopKeyInput
INT softwareInterrupt

SET C,POP;-- C is return value
SET X,POP
SET B,POP
FRI ;-- from interrupt

割り込みハンドラーは、入力されたキーがいっぱいになるまでバッファーに追加し、カウンターに1を追加します。これは、割り込みハンドラー自体に入れることができますが、ビジーループ中に割り込みを再アクティブ化する必要があります。

于 2012-05-26T20:33:22.433 に答える