Я пишу маленькое «ядро», которое отображает «Hello world!»на экране.У меня есть работающая функция putc (put char), поэтому я могу сделать это (и я сделал это) с 12 вызовами функций putc, но я хочу сделать это с помощью функции put (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(;;);
}
Я изменил код put.cpp так, чтобы он отображал на экране первую букву строки ... но это не так ... put.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
После генерации iso, запустив его с qemu-system-x86_64 -hdd kernel.iso, он отображает странный символ (каждый раз тот же) и Hello world!Конечно, после размещения этой функции в файле kernel.c она отображает мир HHello!
Интересно то, что после замены gcc на clang ++ (для put.cpp) он отображает еще один странный символ (также каждый раз такой же)
Может кто-нибудь сказать мне, как правильно связать эти файлы?
edit:
Я забыл добавить, что после замены содержимого функции put () на putc ('a', 7);он правильно отображает эту букву, что является проблемой с аргументами.