NASM ORG 指令有 GCC 版本吗?

Is there a GCC version of the NASM ORG instruction?

我目前正在制作 OS,当我尝试添加 C 支持时,我 运行 遇到了一点问题...在汇编中,我 OS 以 ORG 32768 开头(用于偏移代码来源的 NASM 编译器预处理器指令),但我似乎找不到任何使用 C 的 GCC 编译器来执行此操作的方法. 所以,我的问题是,如何使用 GCC 在 C 中实现这一点(抵消代码的来源)? (是的,我在问之前已经查过了,甚至检查过GNU's official GCC's C preprocessor documentation

ORG 和 .ORG 可以追溯到您使用汇编编写程序并且不一定需要链接器的时代。

据我所知,gnu 工具不支持它。

start.s

.globl _start
_start:
    mov [=10=]xA000,%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    [=14=]xa000,%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    [=14=]x7,%eax
    8015:   c3                      retq   

我使用了 0x8000 (32768) 的入口点。

如果您所说的 gcc 指的是 gnu 工具,而只是想使用汇编语言,那么它会更简单一些,您只需要 binutils 包而不是 gcc。但是您仍然需要链接器并在上面非常简单的链接器脚本示例中使用 ORIGIN,您可以在其中使用 .ORG 与程序集内联。

start.s

.globl _start
_start:
    mov [=15=]xA000,%rsp
    mov [=15=]x7,%eax
    add [=15=]x1,%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    [=17=]xa000,%rsp
    8007:   b8 07 00 00 00          mov    [=17=]x7,%eax
    800c:   83 c0 01                add    [=17=]x1,%eax
    800f:   eb fe                   jmp    800f <_start+0xf>