2012-03-05 9 views
1

私は現在、個人用のプロジェクトとして単純なブートローダを作成しています。私はアセンブラとしてNASMを使用して構築された動作プロトタイプを持っています。しかし、私はGNUツールにもっと慣れ親しんでいきたいので、私はそれらを使って自分の作品を書き直そうとしています。binutilsをLinuxで使用して、シンプルなブートローダを書き込むために

オンラインでこの小さなサンプルがあります。'Hello World' Bootloaderは、「ブートローダー」を作成してビルドするためのいくつかのツールの使用方法を示しています。しかし、読んだあと、「ガス」はgccのバックエンドであり、直接呼び出されるべきではないということは私の理解である。この情報は、プログラムのサイズを計算するためにシンボルを使用したアセンブリー・ファイル内の式を書き込もうとしたときに発生しました。これは、0x55を書き込む前に書き込む必要があったバイト数と、0xAAです。

;--------------------------------------------- 
; Write Zeros up to end of program - 2 then boot signature 
;--------------------------------------------- 
size equ  $ - entry 
     times (512 - size - 2) db 0 
     db  0x55, 0xAA    ;2 byte boot signature 

ネイティブガスによって読ま構文を使用して、式のこの等価セットを記述する方法があります:NASMコードのこのビットを使用していますか?私の試みは、たとえば、失敗した:

.size len, (512 - ((message + 12) - _start)) 

この式を使用してasに渡すは私に次のエラーを与える:

./gasbootloader.asm:24: Error: invalid sections for operation on `message' and `_start' 

私は、シンボルが得ることができるように、gccを通じて私のプログラムに合格する必要がありますか解決されましたか?

+0

あなたの試みが元のコードにどのようにマップされているのかわかりません - あなたは 'len'と' message'と '_start'が何であるか説明できますか? –

答えて

2

GNUアセンブラには、.orgという指令があり、NASMで行う必要のない計算が不要になります。

entry: 
    xor %eax, %eax 
    ret 

    .org 510 
    .byte 0x55, 0xAA 

と建築後のオブジェクト・ファイルのダンプ:あなたが見ることができるようにあなたが特別な努力なしにそれを配置したい場所を

$ clang -c -o example.o example.s 
$ otool -t example.o 
example.o: 
(__TEXT,__text) section 
0000000000000000 31 c0 c3 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa 

は、0x55 0xAAが終わるここでは例のソースファイルです。

+0

簡単な質問:http://sourceware.org/binutils/docs-2.22/as/index.htmlを見て、シンボルの開始アドレスを指定するためのディレクティブがあるかどうかを調べようとしています。例えば、私は_startに0x7c00でロードするように指示したいとします。 –

+0

リンクするときに '--image-base'を使うことができます。私はそれがソースファイルに直接起こるようにしようとすることに反対することをお勧めします。 –

+0

gccは16ビットコードを生成しないので、gccが生成するものを実行するために、32ビットプロテクトモードに切り替えるために16ビットと32ビットのアセンブリコードを記述する必要があります。 –

関連する問題