是否有一个GCC版本的NASM ORG指令



我目前正在制作一个操作系统,当我试图添加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>

最新更新