"制御できないものを、構造で受け止める。それが割り込みの本質である。"
アセンブリの世界では、すべてが直線的ではない。
命令が順に並び、実行される ― その幻想を打ち砕く存在がある。
それが、**割り込み(Interrupt)**であり、**例外(Exception)**である。
そして、それらを呼び出すための構文が、**INT命令(Interrupt Instruction)**だ。
この章では、INT
という一命令を通じて、
プログラムが外部の力とどう向き合うべきかを問い直す。
INT命令とは何か?
INT命令(Interrupt)は、
現在の命令の流れを中断し、定義された割り込みハンドラに制御を移す命令である。
構文はシンプルだ:
INT n
n
は、割り込み番号(0〜255)。
例:
-
INT 0x10
:ビデオ出力 -
INT 0x13
:ディスクI/O -
INT 0x80
:Linuxの古典的システムコールインターフェース
この命令は、単に「別の場所にジャンプする」ものではない。
ハードウェアとカーネルが協調し、完全な制御移譲を実現する機構である。
割り込みと例外の違い
項目 | 割り込み(Interrupt) | 例外(Exception) |
---|---|---|
発生契機 | 外部(タイマー、I/O) | 内部(ゼロ除算、ページフォルト) |
意図性 | 非同期・非意図的 | 同期・しばしば意図的 |
INT命令 | 明示的に呼び出す | 暗黙的に発火 |
どちらも、**「通常の流れを破壊する構造」**として共通している。
だが、設計上の意味合いは異なる。
- 割り込み:外部との通信
- 例外:設計の曖昧さとの邂逅
INT命令とBIOS:初期の「OS」としての使い方
初期のx86環境では、OSはまだ存在しなかった。
そのため、BIOSが持つINT命令群が、仮想的なOSの役割を担っていた。
-
INT 0x10
:文字出力(VGA) -
INT 0x13
:セクタ読み書き(HDD/FDD) -
INT 0x16
:キーボード入力 -
INT 0x1A
:RTC(リアルタイムクロック)
mov ah, 0x0E ; テレタイプ出力
mov al, 'A'
int 0x10 ; 画面に 'A' を表示
これは、設計者が世界に触れるための最初の詩文だった。
Linuxにおける INT 0x80 と syscall との違い
Linuxにおいては、INT 0x80
も使われた:
mov eax, 1 ; syscall番号: write
mov ebx, 1 ; fd
mov ecx, msg ; buffer
mov edx, len ; length
int 0x80
しかし、64bit移行後はより効率的なsyscall
命令に置き換えられた。
なぜか?
-
INT
は汎用割り込み機構の一部であり、重い -
syscall
は高速な制御移譲を可能とする専用命令である
とはいえ、INT 0x80
は依然として、割り込みベースの設計思想の遺構として重要な位置を占めている。
例外ハンドリング:ゼロ除算を例に
例:
xor eax, eax
div eax ; ゼロ除算 → 例外発生(INT 0)
このとき、CPUは:
- 現在の命令の実行を中断し
-
IDT
(Interrupt Descriptor Table)に定義された#DE
(Divide Error)ハンドラを呼び出す
つまり、設計の誤りが、ハードウェアによって捕捉され、構造化される。
これは、「エラーを設計する」思想の原型である。
割り込みは構造である
割り込みとは:
- 「割り込み」ではなく、制御の層を分ける構造
- ソフトウェアとハードウェアを繋ぐ契約点
- 実行順序という幻想を破壊する、現実の介入
この視点に立つと、INT命令とは:
プログラムが「自ら秩序を壊す」ことを許容する設計である
という哲学を内包していることが分かる。
INT命令が設計者にもたらす倫理的問い
- 何を「外部からの介入」と定義するか?
- その介入を受け入れる体制は整っているか?
- 意図的な中断は、設計か破綻か?
- 失敗(例外)は、排除すべきか、構造化すべきか?
INT命令は、単なる「呼び出し」ではない。
それは、設計者に**“秩序の分断と再接続”をどう扱うかを問う命令**である。
結語:INT命令は、設計の余白である
制御の流れとは、決して直線ではない。
それは、断絶と介入を許容することで初めて、実在する世界と接続可能になる。
INT命令は、
その断絶を構造として扱うための記号であり、
例外を論理として引き受けるための容器である。
"設計とは、全てをコントロールすることではない。コントロールできないものに、構造を与えることだ。"