Okay, mal ein paar Tipps:
Ich empfehle eine Funktion, die einfach nur ein Zeichen ausgibt. void kputc(char c) oder so. Diese Funktion beinhaltet die Ausgabe normaler Zeichen, sowie die Verarbeitung von Zeilenumbrüchen (\n) und der ganzen anderen Steuerzeichen (\t, \r, \b, ...), wenn du dich entschließt die zu unterstützen. Durch diese Funktion sollte sich deine kprintf-Funktion vereinfachen, weil dann kprintf nicht mehr direkt auf den Videospeicher zugreifen muss. kprintf sollte nur noch kputc aufrufen und keine anderen globalen Variablen (video, iOff, iCursor) anfassen.
Allerdings kannst du dir noch eine weitere kleine Funktion void kputs(char *string) oder so bauen, die nichts anderes macht als den String komplett auszugeben. Das sollte eine einfache Schleife sein, die nur kputc aufruft. Diese Funktion ist zum Beispiel nützlich, wenn du %s im kprintf verarbeiten willst. Oder wenn du einfach nicht kprintf aufrufen willst.
Die itoa-Funktion von chris12 funktioniert in C nicht. sizeof darf man nicht auf diese Art von Parametern verwenden. Die klassische itoa-Funktion nimmt einen char*-Parameter für buffer und hofft einfach, dass dieser groß genug ist (sonst gibts einen Buffer-Overflow). So könntest du das dann machen:
char *itoa(int number, char *buffer, int base)
{
char *result = buffer;
char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
// TODO: hier negative Zahlen behandeln, wenn base == 10.
do {
buffer++ = digits[number % base];
number = number / base;
} while (number != 0)
*buffer = 0;
// TODO: string umkehren, sonst ist die Zahl rückwärts
return result; // Die Standardfunktion gibt den Eingabepuffer wieder zurück.
}