2012-03-05 56 views
1

我目前正在寫一個簡單的引導程序作爲個人項目。我有一個使用NASM作爲我的彙編程序構建的工作原型。但是我想更熟悉GNU工具,所以我試圖用他們重寫我的工作。在Linux上正確使用binutils來編寫簡單的引導程序

有這個小樣本的在線'Hello World' Bootloader演示寫入和建立「引導程序」使用的一些工具。然而,在閱讀之後,我的理解是'gas'是gcc的後端,不應該直接調用它。當我試圖在我的程序集文件中寫入表達式時,我遇到了這些信息,這些表達式使用符號來限制程序的大小,所以我會知道在寫入0x55和0xAA之前必須寫入多少個0字節,這可以完成使用這位NASM代碼:

;--------------------------------------------- 
; 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 

有沒有辦法用GAS本身讀取的語法編寫這個等效的表達式集?我的嘗試都失敗了,例如:

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

使用這種表達,並把它傳遞給as給了我以下錯誤:

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

我需要通過GCC通過我的節目,使符號可以得到解決?

+0

我怎麼沒看到你試圖映射到原代碼 - 你能解釋一下'len'和'message'和'_start'是誰? – 2012-03-05 04:08:50

回答

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 – 2012-03-05 04:30:49

+0

當鏈接器或更好的鏈接器腳本可以使用'--image-base'來做到這一點。我建議不要試圖直接在源文件中進行。 – 2012-03-05 04:51:45

+0

請注意,gcc不會生成16位代碼,因此您必須編寫一些16位和32位彙編代碼才能切換到32位保護模式,以便執行gcc生成的代碼。當您使用指令指定時, – 2012-03-05 05:20:34

相關問題