我正在以实模式开发一个裸骨操作系统。我已经在汇编下编写了我的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);
}
}
这些也是我使用过的网站:
答案 0 :(得分:2)
您必须查看生成的二进制文件的反汇编输出。可能是GCC针对独立式386做了一些意想不到的细分或其他事情。
如果这没有多大帮助,您仍然可以选择使用例如Bochs在那里运行您的操作系统并使用Bochs的集成调试器来查找代码运行时实际发生的情况。