我正在尝试编写一个函数,用C语言打印屏幕字符串。它是一个引导加载程序,因此没有外部库或任何链接。这是我的功能:

void printString(const char* pStr) {
    while(*pStr) {
        __asm__ __volatile__ (
            "movb 0x0e, %%ah\n"
            "movb %[c], %%al\n"
            "int $0x10\n"
            :
            : [c] "r" (*pStr)
            : "ax"
        );
        ++pStr;
    }
}

当我运行这个时,我的VM没有任何错误。它只是坐在那里,光标在屏幕的左上角。有什么想法吗?如果有人认为有帮助,我可以生成一个objdump -d

最佳答案

好吧,在发表了一些有益的评论之后,我可以继续完整的集会。有点像

Print:
            push    %ax
            movb    $0x0E, %ah      # Set interrupt code
            movb    $0x00, %bh      # Set page #
.loop:
            lodsb                   # Load next char
            test    %al, %al        # Check for \0
            je      .done
            int     $0x10           # Call interrupt
            jmp     .loop

.done:
            pop     %ax
            ret

它应该与16位实模式兼容,并且可以与GAS组装,据我所知,GAS在编译16位程序时比GCC工作得更好。

关于c - C内联Asm Int 0x10,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31151132/

10-11 21:04