3

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 でした。

4

1 に答える 1

3

ええと...おそらくご存知のように、Nasm は 2 つのラベルの違いを変更することに同意します。通常の構成は次のようなものです。

dw (int3 - $$) >> 16

ここ$$で、セクションの先頭を指します。これにより、「ファイル オフセット」が計算されます。これはおそらくシフトしたい値ではありません。

dw (int3 - $$ + ORIGIN) >> 16

フラット バイナリを使用している場合、ORIGINNasm に を指定したのはどこですか? orにorgアセンブルし、 ldに伝え、リンカ スクリプトまたはコマンド ラインのいずれかで ld に指示していると思います (?)。これはうまくいくようです。私は興味深い発見をしました: ld (2 つのハイフン) の代わりに (1 つのハイフン)を伝えると、ld は黙って何も出力しません! これをしないでください - あなたは多くの時間を無駄にします!-f elf32-f elf64--oformat=binary.text-oformat=binary--oformat=binary

于 2013-05-03T09:13:06.643 に答える