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

时间:2016-09-14 09:46:59

标签: c arrays pointers assembly char

我正在以实模式开发一个裸骨操作系统。我已经在汇编下编写了我的bootloader。但是我想用C语言编写我的内核。到目前为止一切都很好,但我注意到当我使用char数组(而不是指针)的函数参数时,它们不起作用。例如,当我使用:

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);
}
}

这些也是我使用过的网站:

Building DOS COM files using GCC

Writing Bootloader in Assembly and C

1 个答案:

答案 0 :(得分:2)

您必须查看生成的二进制文件的反汇编输出。可能是GCC针对独立式386做了一些意想不到的细分或其他事情。

如果这没有多大帮助,您仍然可以选择使用例如Bochs在那里运行您的操作系统并使用Bochs的集成调试器来查找代码运行时实际发生的情况。