小编Mim*_*mmo的帖子

链接两个或多个程序集文件

我正在开发一个简单而小型的64位操作系统。到目前为止,我只使用一个文件,并使用NASM进行编译:

nasm -f bin os.asm -o os.bin
Run Code Online (Sandbox Code Playgroud)

然后.bin用qemu 测试文件。
现在,我需要在文件中使用多个os.bin文件。我插入了这一行:

extern helper_func
Run Code Online (Sandbox Code Playgroud)

然后在代码中调用它。在另一个.asm文件中,我创建了此函数或过程。问题是bin格式不支持extern,因此我尝试使用ELF格式创建.obj文件,然后将它们与gcc链接:

gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld
Run Code Online (Sandbox Code Playgroud)

与此链接文件:

ENTRY(_start)

SECTIONS
{
    . = 0x7C00;

    .text :
    {
        *(.text);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行.bin已创建的时,qemu无法识别该文件。我做错了什么?

(我使用过gcc是因为我计划将来使用C代码)

实际上,我什至不知道gcc中所有标志的作用。我已经从Internet XD复制了它们。

到目前为止,这是我所做的:

nasm -f elf os.asm -o os.obj
nasm -f elf helper.asm -o helper.obj
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld -o myos.bin
objcopy --input-target=elf32-little --output-target=binary myos.bin myos.bin.new
qemu-system-x86_64 myos.bin.new …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm osdev bootloader

7
推荐指数
1
解决办法
134
查看次数

GCC内联汇编错误:'lidt'的指令后缀无效

我试图从C调用一些汇编代码。最近,我在将程序从x86切换到x86-64之前开始工作。我有以下代码:

__asm__ __volatile__("lidtl (%0)" : : "r" (&idt_reg));
Run Code Online (Sandbox Code Playgroud)

哪里&idtreg是对结构的引用。用GCC进行编译会给我这个错误:

'lidt'的无效指令后缀

当我添加$令牌时:

__asm__ __volatile__("lidtl $(%0)" : : "r" (&idt_reg));
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

非法的立即寄存器操作数(%rax)

为什么会出现此问题,我该如何解决?

assembly gcc x86-64 inline-assembly osdev

1
推荐指数
1
解决办法
141
查看次数

标签 统计

assembly ×2

osdev ×2

bootloader ×1

gcc ×1

inline-assembly ×1

nasm ×1

x86 ×1

x86-64 ×1