3

NASM と gcc を使用してマルチステージ ブート ローダーを作成しようとしています。この目的のために、grub ブートローダー ソースを参照しています。

ステージ 1 ローダーを作成しましたが、MBR のパーティション テーブルを書きすぎて行き詰まりました。

grub stage1.S では、次のようなコードを使用してパーティション テーブルをスキップしています。

. = _start + STAGE1_PARTEND
.word   STAGE1_SIGNATURE

NASMでそれを行うにはどうすればよいですか?.

回を使用すると、パーティションテーブルが上書きされます。

だから私を助けてください。

4

3 に答える 3

2

に値を割り当てます。.org ディレクティブと同じように扱われる
(このページを参照してください)。

したがって、貼り付けたコードは、現在の原点を変更し、そこ_start + STAGE1_PARTENDに値を持つ単語を配置していますSTAGE1_SIGNATURE

したがって、NASM コードでは、次のようなことができるはずです。

fill: times _start+STAGE1_PARTEND-$ db 0
dw    STAGE1_SIGNATURE
                     ; .word is 16 bits on x86 (regardless of .code16 / .code64)

また、フラット バイナリ出力ファイルで実際にパディングを探して埋めるMASM スタイルまたは GASスタイルの代わりとして、この方法で BIOS ブート セクタをパディングする方法を示す NASM マニュアルのこの例を参照してください。org. = new_position

于 2013-01-12T14:40:57.477 に答える
0

そうです、Nasm は「org」ディレクティブを 1 つしか受け入れません。"." に相当する Nasm です。は「$」ですが、それも役に立たないと思います。GRUB コードを手元に持っていないか、探してみます。パーティションテーブルはどこから「来る」のですか? ディスクから読み取られた場合、署名が既に配置されている可能性があります (?)。おそらく、パーティション テーブルを上書きする前に Nasm コードを「停止」し、既存の sig をそのままにしておくことができるでしょうか? Nasm はほとんど「やりたいこと」をしますが、これは例外かもしれません。ここで明らかに行われているように (G) のように「移動」 (スキップ) したり、新しい場所に集まったりすることはありません - 少なくとも容易ではありません。回避策を見つけるために GRUB コードをダウンロードする必要があるかもしれません。おそらく、次のようなもの...

; stage1 code
; possible padding here?
%incbin "partition_table.bin"
dw (SIG) ; if not part of the .bin code?

... か何か。

于 2013-01-12T16:53:10.807 に答える