我目前正在制作一个操作系统,当我试图添加C支持时,我遇到了一点问题…在汇编中,我的操作系统上的每个程序都以ORG 32768
(用于抵消代码起源的NASM编译器预处理器指令)开始,但我似乎找不到任何使用C的GCC编译器来做到这一点的方法。所以,我的问题是,如何使用GCC在C中实现这一点(抵消代码的起源)?(是的,我在问之前已经查过了,甚至检查了GNU的官方GCC的C预处理器文档)
ORG和。ORG都回到了用汇编语言编写程序的时代,不需要链接器。
gnu工具不支持它。
开始,
.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内联程序集。
开始,
.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>