【问题标题】:Is there a GCC version of the NASM ORG instruction?是否有 NASM ORG 指令的 GCC 版本?
【发布时间】:2016-08-16 03:13:32
【问题描述】:

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

【问题讨论】:

  • 您可以使用链接器脚本设置代码的去向,但我不知道有什么方法可以在 C 中将其存档。
  • 您不能从 C 中执行此操作。如果您将二进制格式与 NASM 一起使用,那么您将获得相同的效果,您需要使用 MikeCAT 所说的链接器脚本。您还需要编写自己的 C 启动代码,然后如果您想使用它,则需要移植 C 库。
  • @MikeCAT 谢谢,我以前没有手工制作过自己的链接器脚本(不需要,我用汇编编写了内核),但我相信我可以通过精彩的谷歌。
  • @RossRidge 我已经移植了足够多的 C 库来用 C 编写一个基本的 hello world 程序,但我很欣赏这个建议,并且通过 C 启动代码,你到底指的是什么?
  • 初始化C库然后调用main的代码。这是 C 程序第一次开始执行的地方。

标签: c gcc assembly nasm


【解决方案1】:

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

gnu 工具不支持 AFAIK。

开始.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 与程序集内联。

开始.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>

【讨论】:

  • 谢谢!这帮助很大:)
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多