カーネル用のブートローダーを作成しようとしています。現時点ではアセンブリで GDT をロードしていますが、GDT (および IDT) を生成する C コードを書きたいと考えています。問題は、ブート セクタが常にアドレス 0x7c00 にロードされるため、ラベルをオフセットする方法が必要なことです。そのアドレスで。bin ファイルにアセンブルする場合は [org 0x7c00] を使用できますが、外部シンボルを使用できるように、ブートローダーをオブジェクト ファイル (この形式では NASM によってサポートされていない組織) にアセンブルしたいと考えています。組織がなければ、アセンブリ コードに次のように記述します。
gdt_descriptor:
dw gdt_end - gdt_start - 1
dd gdt_start
.
.
.
lgdt [gdt_descriptor]
組み立てると次のようになります。
lgdt 0x71
いつあるべきか
lgdt 0x7c71
gdt の開始位置がオフセットを考慮していないため、テーブル自体も間違っています。
自分でオフセットを手動で追加するために保存します(必要な場所がたくさんあります)。開始アドレスを設定するために使用できるディレクティブはありますか?
編集: 0xc700 から 0x7c00 に変更