2011-07-26 31 views
17

我有一般結構的一些NASM文件:如何使用GNU GAS彙編器生成像nasm -f bin這樣的簡單二進制文件?

 [BITS 64] 
     [ORG 0x0000000000200000] 

start: 
     ... 

     ret 

我將它們組裝,像這樣:

nasm -f bin abc.asm 

我想寫一些使用天然氣代替。兩個問題:

  • 我應該在GAS中使用哪些指令?我找到了'.org'指令,但GAS似乎沒有'.bits'指令。

  • 我應該怎樣通過gccas生成一個純二進制文件?即-f bin選項與NASM有什麼關係。

+0

出於好奇:什麼是代碼的目標平臺?我見過的最常見的方法是看到引導扇區的16位裸組件,但事實並非如此,因爲您使用的是64位。 –

+0

[有沒有辦法讓gcc輸出原始二進制?](http://stackoverflow.com/questions/1647359/is-there-a-way-to-get-gcc-to-output-raw -binary) –

回答

10

,我應該用氣什麼指示?我找到了'.org'指令,但GAS似乎沒有'.bits'指令。

彙編器默認爲64 - 位對我來說,你可以使用--32--64,以選擇在命令行上。查看as的手冊以瞭解如何在需要時更改代碼內的體系結構(例如,.code16可用於爲引導加載程序生成實模式代碼)。

您很可能不想使用.org指令來指定代碼的位置,但可能希望使用鏈接腳本或指定文本和數據段在命令行上加載的位置。 (org 0x0000000000200000導致2+ MB二進制文件)。

我應該傳遞給gcc或者生成一個純二進制文件?即-f bin選項與NASM有什麼關係。

$ cat test.S 
.section .text 
.globl _start 
_start: 
     xor %rax, %rax 
     mov test, %rax 
     ret 

test: .quad 0x1234567812345678 


$ as --64 -o test.o test.S 
$ ld -Ttext 200000 --oformat binary -o test.bin test.o 

 
$ objdump -D -b binary -m i386:x86-64 test.bin 
test.bin:  file format binary 
Disassembly of section .data:

0000000000000000 <.data>: 0: 48 31 c0 xor %rax,%rax 3: 48 8b 04 25 0c 00 20 mov 0x20000c,%rax a: 00 b: c3 retq
c: 78 56 js 0x64 e: 34 12 xor $0x12,%al 10: 78 56 js 0x68 12: 34 12 xor $0x12,%al

+0

真棒回答!謝謝! – dharmatech

+0

原始的NASM文件包含一個包含如下行的文件:'xyz equ 0x0000000000100010'。然後他們可以打電話給xyz。我試圖在GAS中做同樣的事情,但這似乎不起作用。即使用'.set xyz,0x0000000000100010'和後來的'調用xyz'似乎沒有什麼用。有什麼想法嗎?也許我應該打開一個單獨的問題。 – dharmatech

+0

你想要什麼樣的跳躍?我不認爲一個絕對的64位電話是可能的。對於間接呼叫,您需要'call * xyz'。 – user786653

1

objcopy把-O二進制

一個很好的選擇是:

as -o test.o test.S 
ld -Ttext 0x7C00 -o test.elf test.o 
objcopy -O binary kernel.elf kernel.bin 

ld --oformat binary的優點是,它更容易使用的符號通過調試:

qemu-system-i386 -hda main.img -S -s & 
gdb main.elf -ex 'target remote localhost:1234' 

參見:https://stackoverflow.com/a/32960272/895245

鏈接腳本

-Ttext適合進行快速和骯髒的測試,但對於嚴重的工作,你應該使用腳本,而不是增加穩健性。

否則,ld將使用用於用戶級應用程序的默認腳本(ld --verbose),該腳本看起來不像您的應用程序。

沒有進一步的信息,最小的劇本,我可以給是:

SECTIONS 
{ 
    . = 2M; 
    .text : 
    { 
     *(.*) 
    } 
} 

然後用-T使用它:

as --64 -o test.o test.S 
ld -T linker.ld --oformat binary -o test.bin test.o 

但你可能會希望修改腳本根據您的具體應用。

我有工作的例子庫對於一些常見的情況:

相關問題