2016-08-16 89 views
1

我目前正在創建一個操作系統,當我嘗試添加C支持時,遇到了一些問題......在彙編中,我的操作系統上的每個程序都以ORG 32768(NASM編譯器預處理器指令,代碼的起源),但我似乎無法找到任何使用GCC編譯器的方式來做到這一點。所以,我的問題是,如何使用GCC在C中實現這一點(抵消代碼的起源)? (是的,我查詢之前詢問,甚至檢查GNU's official GCC's C preprocessor documentationNASM ORG指令是否有GCC版本?

+0

您可以設置其中的代碼將通過使用連接器腳本去,但我不不知道用C存檔的任何方法。 – MikeCAT

+1

你不能從C做這個。如果你在NASM中使用二進制格式,將獲得相同的效果,您需要使用像MikeCAT所說的鏈接器腳本。您還需要編寫自己的C啓動代碼,然後如果要使用該代碼,則需要移植C庫。 –

+0

@MikeCAT謝謝,我以前沒有親手編寫過我自己的鏈接器腳本(不需要,我在彙編中編寫了內核),但我確信我可以通過精彩的Google來弄清楚。 –

回答

4

ORG和.ORG回到你在程序集編寫程序,並不一定需要鏈接器的日子。

gnu工具不支持它AFAIK。

的start.s

.globl _start 
_start: 
    mov $0xA000,%rsp 
    callq fun 
    jmp . 

fun.c

unsigned int fun (void) 
{ 
    return(7); 
} 

fun.ld

MEMORY 
{ 
    ram : ORIGIN = 0x8000, LENGTH = 0x2000 
} 
SECTIONS 
{ 
    .text : { *(.text*) } > ram 
    .rodata : { *(.rodata*) } > ram 
    .data : { *(.data*) } > ram 
    .bss : { *(.bss*) } > ram 
} 

構建命令

as start.s -o start.o 
gcc -O2 -nostdlib -nostartfiles -ffreestanding -c fun.c -o fun.o 
ld -T fun.ld start.o fun.o -o fun 

它生產這個程序:

0000000000008000 <_start>: 
    8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp 
    8007: e8 04 00 00 00   callq 8010 <fun> 
    800c: eb fe     jmp 800c <_start+0xc> 
    800e: 66 90     xchg %ax,%ax 

0000000000008010 <fun>: 
    8010: b8 07 00 00 00   mov $0x7,%eax 
    8015: c3      retq 

我使用了一個入口點0x8000(32768)。

如果通過gcc你意味着GNU工具,只想做彙編語言,那麼這使得它更簡單一些,你只需要binutils包而不是gcc。但是您仍然需要鏈接器,並在上面非常簡單的鏈接器腳本示例中使用ORIGIN,您可以使用.ORG內聯該組合件。

的start.s

.globl _start 
_start: 
    mov $0xA000,%rsp 
    mov $0x7,%eax 
    add $0x1,%eax 
    jmp . 

相同的鏈接腳本如上

as start.s -o start.o 
ld -T fun.ld start.o -o fun 

生產

0000000000008000 <_start>: 
    8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp 
    8007: b8 07 00 00 00   mov $0x7,%eax 
    800c: 83 c0 01    add $0x1,%eax 
    800f: eb fe     jmp 800f <_start+0xf> 
+0

謝謝!這非常有幫助:) –