我正在写显示“ Hello world!”的小“内核”。屏幕上。我有工作的putc(put char)函数,所以我可以用12个putc函数调用来做到(我做到了),但是我想用puts(put string)函数来实现,我想用C ++编写。我知道我可以用C语言实现它,但是将来我将需要使用C ++链接进行C语言...那为什么现在不这样做呢?
这是我的kernel.c代码:
extern void putc(char, char);
extern void puts(char*, char);
extern void clear(void);
void start_kernel(void)
{
clear();
puts("Hello world!", 7);
putc('H', 7);
putc('e', 7);
putc('l', 7);
putc('l', 7);
putc('o', 7);
putc(' ', 7);
putc('w', 7);
putc('o', 7);
putc('r', 7);
putc('l', 7);
putc('d', 7);
putc('!', 7);
for(;;);
}
我更改了puts.cpp代码,以便它应该在屏幕上显示字符串的第一个字母...但是没有... puts.cpp:
extern "C" void putc(char, char);
extern "C"
{
void puts(char *s, char color)
{
putc(*s, 7);
}
}
link.bash脚本:
nasm start.asm -f elf64 -o start.o
nasm putc.asm -f elf64 -o putc.o
nasm clear.asm -f elf64 -o clear.o
gcc puts.cpp -std=c++0x -c -o puts.o
gcc kernel.c -O3 -fomit-frame-pointer -masm=intel -c -o kernel.o
ld -Tkernel.ld -o kernel.bin start.o kernel.o putc.o puts.o clear.o
用qemu-system-x86_64 -hdd kernel.iso生成iso运行它之后,它显示奇怪的字符(每次相同)和Hello world! 当然,将此功能放入kernel.c文件后,它会显示HHello世界!
有趣的是,用clang ++(对于puts.cpp)替换gcc后,它会显示另一个奇怪的字符(每次都相同)
有人可以告诉我如何正确链接此文件吗?
编辑:
在用putc('a',7)替换puts()函数内容之后,我忘了补充一点;它正确显示了此字母,这是参数有问题。