2017-12-15 8 views
0

同時に2つの作業を行うにはどうすればよいですか?アセンブリでのマルチスレッド32ビットまたは16ビット

何かを連続して表示している間、プログラムは反対側のキー押しイベントを待つべきです。

私のクラスプロジェクトのための簡単なゲームを開発したいと思います。 C++では、入力イベントの表示用に異なるスレッドを使用しました。

何かを連続して表示しているときに、どのようにキー押し値を取得できますか?

割り込みを使用できますか?はいの場合、どのように使用できますか? INT

私は同期割り込みを発生MASM 32ビットまたは16ビット

+0

あなた自身で割り込みハンドラをインストールすることはできません。オペレーティングシステムのみが可能です。次に、キーを押すたびにOSに通知するように依頼します。どのOSを使用していますか? – ComicSansMS

+2

私は単純なゲームのためにMTを避けるための考え方をcodereviewサイトでチェックすることができます(MTがそのようなことに悪用されるにはコストがかかりすぎたので、ほとんどのプログラマーが8/16ビットマシンで約20年間行っていました):https ://codereview.stackexchange.com/a/133845/110284 - その後、OSからバッファリングされた入力を再利用するか、描画ループの速度が十分速ければ、描画間の制御をポーリングするだけで十分です。人間のボタンアクションのほとんどは、あなたが軽くボタンをタップしようとしても、50ms以上、70-150msに向かいます。しかし、まずあなたのターゲットOSを選択して、あなたの可能性を見てください。 – Ped7g

+0

@ComicSansMS Windows –

答えて

0

intを使用しています。ソフトウェアで生成された割り込みに使用します。

あなたのコードがリング0(つまり、16ビットリアルモードでは正常ですが32ビットプロテクトモードではないカーネルモード)で実行されている場合は、割り込みハンドラをインストールすることによって割り込みを取得します。

または(as Ped7G says)非ブロック型のint 21hまたはint 10hシステムコールで描画ループごとにキープレスを1回ポーリングすることができます。フルマルチタスクOS(例えばWindowsのNT以降、またはLinuxまたはOS Xが、ない DOS)の下で実行している場合、あなたの唯一のオプションは(システムコールを使用して)依頼することです


OSで非同期イベントをプロセスに通知します。これは、ハードウェアに直接アクセスすることができず、OSがすべての割り込みハンドラを制御できるため、基本的にアセンブリ言語とは関係ありません。つまり、同じシステムコールに対して同じ引数を使用して、Cとまったく同じ方法で実行します。唯一の違いは、foo(a,b,c)の代わりにecx /push ebx/push eax/call foo/add esp, 12を押すことです。

たとえば、別のスレッドを開始し、キー待ちのシステムコール(ブロックする)を呼び出してから、メインスレッドが時々ポーリングするフラグを設定するか、または待機するスレッドを設定することができますキーを押すと、実際にはキー押し自体が処理されます。

また、キー待機スレッドがある種の信号をメインスレッドに送ることもできます。これは、ユーザー空間の割り込みハンドラとほぼ同じです。シグナルが純粋なソフトウェア発明であることを除いて、メインスレッドがインストールしたシグナルハンドラ機能を実行させることによって "シグナル"を送るのはOSに任されています。 (IDKはWindowsにPOSIXシグナルと全く同じものがあるので、MASMを使ってWindowsの実行ファイルを開発していると仮定すると、メインスレッドの無限ループを中断するオプションにはならないかもしれません)。/Oも可能です。たとえば、すべてのフレームを描画した後、ノンブロッキングシステムコールを持つキープレスのメインスレッドポーリングを行うことができます。

私はここで詳しく説明しませんが、私が使用したフレーズのいくつかをGoogleで検索することができます。質問は特定の答えにとってはあまりに一般的ですが、これはOSの機械がこのようなことをサポートするためにどのように働くかです。

関連する問題