我正在开发一个实模式下的基础操作系统。我已经使用汇编语言编写了引导加载程序,但我想使用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语言编写引导程序
ptr
是一个const char*
类型。这可能与此有关吗? - Bathshebads
和ss
指向两个不同的段吗?字符数组是在堆栈上创建的。 - Margaret Bloom