NASMで定数IDT (割り込み記述子テーブル)エントリを定義しようとしています。そのためには、リンク時まで解決されないダブルワード アドレスの上位ワードをデータ テーブルに出力する必要があります。それを行う方法はありますか?
割り込みハンドラは次のとおりです。
;;; Interrupt 3 (breakpoint) handler. For now, just poke the screen and halt.
align 8
int3:
mov [0xb8000],dword '* * '
hlt
これを参照する IDT エントリを次に示します。オフセットの最上位ワードと最下位ワードは、別々に非連続に格納する必要があります。
;; Interrupt 3 - breakpoint
dw int3 ; offset (low) <---- WORKS
dw codesel ; code selector
db 0 ; unused
db 0b10001111 ; present, ring 0, 32-bit trap gate
dw int3 >> 16 ; offset (high) <---- ASSEMBLY ERROR
NASM は正しく LD に int3 のアドレスの下位ワードを発行させますが、上位ワードはアセンブリ時に次のエラーで失敗します。
pgm.asm:240: エラー: シフト演算子はスカラー値にのみ適用できます
NASM は、リンク時まで定義されていない値で計算を行いません。わかりましたが、これを回避する方法が必要です。私はできた:
- int3 を絶対に見つける
- アセンブリ時ではなく実行時に IDT をビルドする
おそらく実行時に IDT を構築することになるでしょうが、リンク時まで解決されないアドレスの上位ワードをアセンブラ/リンカにデータ テーブルに出力させる方法があるかどうかを知っておくとよいでしょう。 .
詳細:
- NASM 2.20.01 1
- NASM出力フォーマット
aout
- LD バージョン 2.22
- 32ビットモード(NASM「bits 32」ディレクティブ発行)
1これはおそらくタイプミスです。今日の私のディストリビューションの最新バージョンは 2.12.01 です。この質問を書いた時点で利用可能な nasm の最新バージョンは 2.10.01 でした。