如何在实模式下使用C字符数组

3

我正在开发一个实模式下的基础操作系统。我已经使用汇编语言编写了引导加载程序,但我想使用C语言编写内核。到目前为止一切顺利,但是我注意到当我在函数参数中使用字符数组(而不是指针)时,它们不能正常工作。例如:

puts("Hello, World!");

或者,

char *ptr = "Hello, World!";
puts(ptr);

这些都是有效的。但是当我这样做时:

char s[]="Hello, World!";
puts(s);

它没有给我任何东西。我想知道,为什么会发生这种情况以及如何以这种方式使用char数组? 同时这是我的“puts”函数:

void puts(char* s){
for(; *s!=0; s++)
    asm volatile ("int $0x10": : "a"(0x0e00 | *s));
}

编辑:

我正在使用GCC编译,具体如下:

gcc -std=gnu99 -Os -nostdlib -m16 -march=i386 -ffreestanding -o kernel.bin -Wl,--nmagic,--script=raw_image.ld kernel.c

以下是链接脚本:

OUTPUT_FORMAT(binary);
ENTRY(main);
SECTIONS
{
. = 0x0000;
.text :
{
    *(.text);
}
.data :
{
    *(.data);
    *(.bss);
    *(.rodata);
}
}

这些是我使用的网站:
- 使用GCC构建DOS COM文件 - 汇编和C语言编写引导程序

1
严格来说,*ptr = "Hello, World!" 的 ptr 是一个 const char* 类型。这可能与此有关吗? - Bathsheba
1
@M.SChaudhari:当然有用,但这怎么帮助呢?你读完整个问题了吗? - Paul R
1
@B.Kaan 你如何确保这一点?调用者可以随意给 BX 赋值,如果它非零,你的输出就会进入一个不可见的页面。 - fuz
3
dsss指向两个不同的段吗?字符数组是在堆栈上创建的。 - Margaret Bloom
1
Open Watcom非常理想,因为它允许使用自己的内联汇编器,生成16位代码,并且可以理解实模式段、远指针等。 - Michael Petch
显示剩余12条评论
1个回答

2

你需要查看反汇编器的输出结果来分析生成的二进制文件。可能是因为GCC针对自由操作的386做了一些不符合预期的段操作或其他操作。

如果这并没有多大帮助,你还可以使用例如Bochs运行你的操作系统,并使用Bochs集成的调试器来查找代码运行时实际发生了什么。


1
关于gcc和freestanding 386的观点很好。值得一提的是,Boch's很乐意以任何格式展示给您反汇编代码,您只需提出要求!请参阅此处链接:http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html#AEN4067 Boch's调试器在许多情况下都帮了我大忙。 - enhzflep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接