2016-08-16 56 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

谢谢!这非常有帮助:) –