NASM组织指令是否有GCC版本?

NASM组织指令是否有GCC版本?,c,gcc,assembly,nasm,C,Gcc,Assembly,Nasm,我目前正在制作一个操作系统,当我尝试添加C支持时,我遇到了一点问题。。。在汇编中,我的操作系统上的每个程序都以ORG 32768开始,这是NASM编译器的预处理器指令,用于抵消代码的起源,但我似乎找不到任何方法使用GCC编译器实现这一点。因此,我的问题是,如何使用GCC抵消C中代码的起源?是的,我在询问之前已经查过了,甚至查过了ORG和.ORG。回到以前,你用汇编编写程序,不一定需要链接器 gnu工具根本不支持它 开始 .globl _start _start: mov $0xA000,

我目前正在制作一个操作系统,当我尝试添加C支持时,我遇到了一点问题。。。在汇编中,我的操作系统上的每个程序都以ORG 32768开始,这是NASM编译器的预处理器指令,用于抵消代码的起源,但我似乎找不到任何方法使用GCC编译器实现这一点。因此,我的问题是,如何使用GCC抵消C中代码的起源?是的,我在询问之前已经查过了,甚至查过了ORG和.ORG。回到以前,你用汇编编写程序,不一定需要链接器

gnu工具根本不支持它

开始

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

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   
与上面相同的链接器脚本

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>

ORG和.ORG可以追溯到您在汇编中编写程序而不一定需要链接器的时代

gnu工具根本不支持它

开始

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

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   
与上面相同的链接器脚本

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>

你可以通过使用链接器脚本来设置代码的去向,但我不知道用C来归档代码的任何方法。你不能用C来实现这一点。如果你在NASM中使用二进制格式,那么你将得到同样的效果,你将需要像MikeCAT说的那样使用链接器脚本。您还需要编写自己的C启动代码,然后如果您想使用它,您需要移植C库。@MikeCAT谢谢,我以前没有手工制作过自己的链接器脚本,不需要,我在汇编中编写了内核,但是我相信我可以用谷歌的出色功能来解决这个问题。@RossRidge我已经移植了足够多的C库,可以用C编写一个基本的hello world程序,但是我很欣赏这个建议,通过C启动代码,你到底指的是什么?初始化C库然后调用main的代码。这是C程序开始执行的地方。你可以通过使用链接器脚本来设置代码的去向,但我不知道用C来存档代码的任何方法。你不能从C来完成这项工作。如果你在NASM中使用二进制格式,那么你将得到同样的效果,你将需要像MikeCAT所说的那样使用链接器脚本。您还需要编写自己的C启动代码,然后如果您想使用它,您需要移植C库。@MikeCAT谢谢,我以前没有手工制作过自己的链接器脚本,不需要,我在汇编中编写了内核,但是我相信我可以用谷歌的出色功能来解决这个问题。@RossRidge我已经移植了足够多的C库,可以用C编写一个基本的hello world程序,但是我很欣赏这个建议,通过C启动代码,你到底指的是什么?初始化C库然后调用main的代码。这是C程序开始执行的地方。谢谢!这帮了大忙:谢谢!这非常有帮助: