Cを使用して単純なカーネルを作成しようとしています。すべてが正常に読み込まれ、動作し、ビデオメモリにアクセスして文字を表示できますが、何らかの理由で単純なputs関数を実装しようとすると動作しません。私は自分のコードと他のコードを試しました。また、関数の外部で宣言されている変数を使用しようとすると、機能しないようです。これは私自身のコードです:
#define PUTCH(C, X) pos = putc(C, X, pos)
#define PUTSTR(C, X) pos = puts(C, X, pos)
int putc(char c, char color, int spos) {
volatile char *vidmem = (volatile char*)(0xB8000);
if (c == '\n') {
spos += (160-(spos % 160));
} else {
vidmem[spos] = c;
vidmem[spos+1] = color;
spos += 2;
}
return spos;
}
int puts(char* str, char color, int spos) {
while (*str != '\0') {
spos = putc(*str, color, spos);
str++;
}
return spos;
}
int kmain(void) {
int pos = 0;
PUTSTR("Hello, world!", 6);
return 0;
}
(spos
開始位置)のものは、グローバル位置変数を作成できないためです。putc
正常に動作しますが、puts
動作しません。私もこれを試しました:
unsigned int k_printf(char *message, unsigned int line) // the message and then the line #
{
char *vidmem = (char *) 0xb8000;
unsigned int i=0;
i=(line*80*2);
while(*message!=0)
{
if(*message=='\n') // check for a new line
{
line++;
i=(line*80*2);
*message++;
} else {
vidmem[i]=*message;
*message++;
i++;
vidmem[i]=7;
i++;
};
};
return(1);
};
int kmain(void) {
k_printf("Hello, world!", 0);
return 0;
}
なぜこれが機能しないのですか?ネイティブGCC(色とsposデータなしで使用printf("%c")
)でputs実装を使用してみましたが、正常に機能しました。