C ++打印字符串在引导加载程序中工作,但在内核中不起作用

时间:2018-02-24 19:02:54

标签: c++ assembly x86-16 osdev real-mode

我正在使用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");
}

0 个答案:

没有答案