gpt4 book ai didi

gcc - 帮助构建 16 位操作系统

转载 作者:行者123 更新时间:2023-12-01 13:06:33 25 4
gpt4 key购买 nike

我正在尝试构建一个类似 OS 的旧 16 位 DOS。

我的示例内核代码:

    asm(".code16\n");
void putchar(char);
int main()
{
putchar('A');
return 0;
}
void putchar(char val)
{
asm("movb %0, %%al\n"
"movb $0x0E, %%ah\n"
"int $0x10\n"
:
:"r"(val)
) ;
}

我是这样编译的:

nasm -f bin -o ./bin/boot.bin ./source/boot.asm
gcc -nostdinc -fno-builtin -I./include -c -o ./bin/kernel.o ./source/kernel.c
ld -Ttext=0x9000 -o ./bin/kernel.bin ./bin/kernel.o -e 0x0
dd if=/dev/zero of=./bin/empty.bin bs=1440K count=1
cat ./bin/boot.bin ./bin/kernel.bin ./bin/empty.bin|head -c 1440K > ./bin/os
rm ./bin/empty.bin

然后我在虚拟机中运行它。

当我为常量值创建 putchar 函数(在内核代码中)时......即像这样:

 void putchar()
{
char val = 'A';
asm("movb %0, %%al\n"
"movb $0x0E, %%ah\n"
"int $0x10\n"
:
:"r"(val)
) ;
}

然后它工作正常。但是当我向它传递参数时(在前面的代码中),它会为任何字符打印一个空格。我该怎么办?

最佳答案

如果您试图让 gcc 生成 16 位代码,您需要使用 .code16gcc 而不是 .code16,以便获得正确的堆栈操作功能参数:参见 "Writing 16-bit Code" in the gas documentation .

(此外,根据您使用的 gcc 版本,您可能需要使用 -fno-unit-at-a-time 编译您的 kernel.c code> 或 -fno-toplevel-reorder 选项,以确保 asm() 指令在任何编译代码之前确实被汇编器遇到 - 否则编译器可能会乱序周围。)

关于gcc - 帮助构建 16 位操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com