Я работаю над простой ОС реального режима на C ++. Я не могу понять, как печатать строки. Следующий код работает, когда он находится в загрузчике, но не в ядре.
__asm__ __volatile__(".code16gcc \n");
__asm__ __volatile__ ("xor ax, ax\n");
__asm__ __volatile__ ("mov ds, ax\n");
__asm__ __volatile__("jmp main \n");
void printf(const char* str)
{
while(*str)
{
__asm__ __volatile__("int 0x10" : : "a"(0x0e00 | *str), "b"(0x0007));
++str;
}
}
void main(){
printf("Hi!");
}
Я уверен, что это потому, что ds регистрирует значение 0, но код на самом деле равен 0x7E00 (вот где его помещает загрузчик). Я попытался установить ds в 0x7E0, что должно заставить его правильно загружать данные, потому что 0x7E0 * 16 = 0x7E00, но все равно не работает. Возможно, это просто глупая ошибка, но я был бы признателен за помощь. Если это имеет значение, вот мой код загрузчика:
__asm__(".code16gcc \n");
void main(){
__asm__ __volatile__("mov al, 0x02 \n");
__asm__ __volatile__("xor ah, ah \n");
__asm__ __volatile__("int 0x10 \n");
__asm__ __volatile__("xor ax, ax \n");
__asm__ __volatile__("mov es, ax \n");
__asm__ __volatile__("mov bx, 0x7E00 \n");
__asm__ __volatile__("mov al, 0x03 \n");
__asm__ __volatile__("mov ch, 0x00 \n");
__asm__ __volatile__("mov cl, 0x02 \n");
__asm__ __volatile__("mov dh, 0x00 \n");
__asm__ __volatile__("mov ah, 0x02 \n");
__asm__ __volatile__("int 0x13 \n");
__asm__ __volatile__("jmp 0:0x7E00 \n");
}
Задача ещё не решена.
Других решений пока нет …