割込みプログラムで特徴的な使用コマンド例を上げてみたいと思います。
割込み許可のSTI(セットインタラプト) そして割込み禁止のCLI(クリアインタラプト)命令です。
割込み動作中には他の割込み受付を一時的に停止してやらなければならない「ダークタイム」が存在します。
処理途中の割込みプログラム動作中に他の割込みが入ったりすると、使っている一時変数が壊されて動作がおかしくなってしまいます。
割込みレベル(優先順位)がちゃんと順番どおりスタックメモリーにちゃんと格納されて安全な領域になるまで他のプログラムの動作実行を禁止(優先的に処理)する命令がちゃんと準備されています。
なおこの許可と禁止命令は限られた時間内に処理を終えるよう正しく使わないと、反応レスポンスが悪い設計となるので、慎重かつ正しく記述しないといけません。
なおMS-DOSには存在するこのような記述方式は、マルチタスクOSのWindowsには存在しません。(絶対番地指定ももちろんありません)
こうしたハードを直接アクセスするプログラム形式は「お行儀の悪い」…いってみれば「おやつのツマミ食い」的なスパゲッティ方式と呼ばれ、後のメンテナンスや拡張性に大きな負担となることから、プログラム記述の共通スタイル=Windowsフォームが展開されてきたわけです。
現代Windowsではデバイスドライバプログラム、がこの相当部分の役目になるのですね。
割込み許可のSTI(セットインタラプト) そして割込み禁止のCLI(クリアインタラプト)命令です。
割込み動作中には他の割込み受付を一時的に停止してやらなければならない「ダークタイム」が存在します。
処理途中の割込みプログラム動作中に他の割込みが入ったりすると、使っている一時変数が壊されて動作がおかしくなってしまいます。
割込みレベル(優先順位)がちゃんと順番どおりスタックメモリーにちゃんと格納されて安全な領域になるまで他のプログラムの動作実行を禁止(優先的に処理)する命令がちゃんと準備されています。
なおこの許可と禁止命令は限られた時間内に処理を終えるよう正しく使わないと、反応レスポンスが悪い設計となるので、慎重かつ正しく記述しないといけません。
なおMS-DOSには存在するこのような記述方式は、マルチタスクOSのWindowsには存在しません。(絶対番地指定ももちろんありません)
こうしたハードを直接アクセスするプログラム形式は「お行儀の悪い」…いってみれば「おやつのツマミ食い」的なスパゲッティ方式と呼ばれ、後のメンテナンスや拡張性に大きな負担となることから、プログラム記述の共通スタイル=Windowsフォームが展開されてきたわけです。
現代Windowsではデバイスドライバプログラム、がこの相当部分の役目になるのですね。
PR
割込みは業界用語でインタラプト。
各種の番号が割り当てられており、例えばINT21Hのファンクション25Hでは…
割込みベクトルをセットする。
というように、MS-DOS内部コールを使って番地設定を記述します。
実際に使うその前には…
INT21Hの35H、割込みベクトルを得る、という機能を使って、割込まれる以前のセットされた番地をちゃんとメモしておいてから使わなければなりません。
こうしたよく使われる既定のプログラムはマクロとして定義され、必要なパラメータをソースに記述することによってアセンブラが各種必要な定数を展開してくれます。
こうしたファンクションコールの塊そのものがMS-DOS本体の中核にあって、さまざまなパーツのスイッチを動かしている訳です。
Windowsではカーネル部分とよばれ、System32フォルダに入っているいろいろなプログラム群がこれに相当します。
各種の番号が割り当てられており、例えばINT21Hのファンクション25Hでは…
割込みベクトルをセットする。
というように、MS-DOS内部コールを使って番地設定を記述します。
実際に使うその前には…
INT21Hの35H、割込みベクトルを得る、という機能を使って、割込まれる以前のセットされた番地をちゃんとメモしておいてから使わなければなりません。
こうしたよく使われる既定のプログラムはマクロとして定義され、必要なパラメータをソースに記述することによってアセンブラが各種必要な定数を展開してくれます。
こうしたファンクションコールの塊そのものがMS-DOS本体の中核にあって、さまざまなパーツのスイッチを動かしている訳です。
Windowsではカーネル部分とよばれ、System32フォルダに入っているいろいろなプログラム群がこれに相当します。
割込みプログラムの中では、初期化ルーチンが大切で、動かすまでに多くの事前設定が必要です。
初期化プログラムの動作では…
1.マシン語動作メモリエリアの設定(何処の番地で動作をさせるか)
2.どのI/Oポートを入力するのか
3.動作タイマーの周波数設定(基本クロック係数は?)
4.マスク解除(動作開始タイミング)
といった手順を経て、やっと定期的に割込みプログラムが動作開始しはじめると
5.入力ポートスキャン
6.変化Bit処理とカウンタ更新
またプログラム終了時には
7.呼ばれた元プログラムに復帰のためのワーク変数復帰
おおまかな骨子はこんな感じですが、実際のコーティングには内部ファンクションコールといって、MS-DOSライブラリ機能のINTコールを使ってCPUレジスタやらベクトルやらの相互連携が必要です。
ユーザープログラムを動かすまでの環境事前準備、お膳立てが結構あります。
初期化プログラムの動作では…
1.マシン語動作メモリエリアの設定(何処の番地で動作をさせるか)
2.どのI/Oポートを入力するのか
3.動作タイマーの周波数設定(基本クロック係数は?)
4.マスク解除(動作開始タイミング)
といった手順を経て、やっと定期的に割込みプログラムが動作開始しはじめると
5.入力ポートスキャン
6.変化Bit処理とカウンタ更新
またプログラム終了時には
7.呼ばれた元プログラムに復帰のためのワーク変数復帰
おおまかな骨子はこんな感じですが、実際のコーティングには内部ファンクションコールといって、MS-DOSライブラリ機能のINTコールを使ってCPUレジスタやらベクトルやらの相互連携が必要です。
ユーザープログラムを動かすまでの環境事前準備、お膳立てが結構あります。
割込みの動作は、割込みコントローラからの信号でCPUが今している動作を中断して割込みプログラムを実施する仕組みです。
だから、割込みプログラムを使用するには、割込みプログラムで使っている全てのレジスタを保存してから動かします。
この保存のためにレジスタ値をメモリー番地の上位から順にスタック(積み重ね)していきます。
でっ、割込み処理が終了したら、保存していたその値を元に戻して、終了します。
忙しい動作の中にも、ちゃ~んと記述フォームスタイルがあるんです。でないと…プログラムが元に戻れない…暴走しちゃいます。
だから、割込みプログラムを使用するには、割込みプログラムで使っている全てのレジスタを保存してから動かします。
この保存のためにレジスタ値をメモリー番地の上位から順にスタック(積み重ね)していきます。
でっ、割込み処理が終了したら、保存していたその値を元に戻して、終了します。
忙しい動作の中にも、ちゃ~んと記述フォームスタイルがあるんです。でないと…プログラムが元に戻れない…暴走しちゃいます。
電気信号が割込みコントローラーに伝わってプログラムがジャンプする場所、それが「割込みベクトル」っていう場所。
実際には飛んで欲しいアドレスが書いてあって、割込みの電気信号が発生する毎にジャンプしてくれる仕掛けです。
標準状態のOSでは単に「戻れ」ってなっていますので、ユーザがこの部分にしたい動作を書いてやると…いいわけです。
この手続きをコーティングするための道具がアセンブラやCなどの専門ツールです。
実際には飛んで欲しいアドレスが書いてあって、割込みの電気信号が発生する毎にジャンプしてくれる仕掛けです。
標準状態のOSでは単に「戻れ」ってなっていますので、ユーザがこの部分にしたい動作を書いてやると…いいわけです。
この手続きをコーティングするための道具がアセンブラやCなどの専門ツールです。