Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bios/Real模式下的C编译器?_C_Assembly_Operating System - Fatal编程技术网

Bios/Real模式下的C编译器?

Bios/Real模式下的C编译器?,c,assembly,operating-system,C,Assembly,Operating System,所以,我想编写一个操作系统。引导加载程序是在汇编中编写的。现在我做了内核,但是可以用C写吗?我在gcc-S上尝试过,但在windows上使用了im,输出文件是: .file“Kernel.c” .文本 .ident“GCC:(MinGW.org GCC Build-2)9.2.0”这是一个相当复杂的过程-但是如果您能够访问gnu binutils,您可以使用objcopy: gcc -c -m16 -Os -ffreestanding -Wall -Wextra -fno-exceptions

所以,我想编写一个操作系统。引导加载程序是在汇编中编写的。现在我做了内核,但是可以用C写吗?我在gcc-S上尝试过,但在windows上使用了im,输出文件是: .file“Kernel.c” .文本
.ident“GCC:(MinGW.org GCC Build-2)9.2.0”

这是一个相当复杂的过程-但是如果您能够访问gnu binutils,您可以使用objcopy:

gcc -c -m16 -Os -ffreestanding -Wall -Wextra -fno-exceptions -o main.o main.c 
ld -melf_i686 -static -nostdlib --nmagic -Ttext 0x1000 -o boot/kernel_entry.elf main.o
objcopy -Obinary boot/kernel_entry.elf kernel.bin
这将输出一个二进制文件,您可以使用qemu执行该文件

如果您需要一个示例,那么您可以在这里找到一个使用makefile的好示例项目:

Watcom编译器支持实模式代码。您甚至可以选择8086作为目标CPU(但是,您也可以选择80286或80386)

编译器也支持分段代码

但是,至少旧版本10.6只支持旧的OMF对象文件格式(更高版本似乎支持COFF,但我怀疑分段代码是否支持COFF)

这种对象文件格式很难转换为可读性更好的文件格式


如果您的内核小于64K,您可以创建一个“DOS COM”文件(由编译器支持)。

普通gcc不支持编译实数模式的代码。考虑使用IA16 GCC或一个设计用于实际模式的编译器,例如开放的WATCOM。注意,这会生成一个32位内核。OP想要在实模式下编程。@fuz-Ah然后我会编辑我的答案-仍然基本相同
gcc-m16
生成本质上是32位代码但编码为16位模式的代码。它不知道分段,结果在i286或更早的处理器上不起作用。这并不是编写16位软件的好方法。@fuz如果它适用于似乎正在学习atm的OP,那么它是否是一种好方法并不重要,因为交叉编译gcc超出了SO答案的范围