我正在开发一个简单而小型的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) 我试图从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)
为什么会出现此问题,我该如何解决?