C 内联汇编 Int 0x10

C Inline Asm Int 0x10

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

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

当我 运行 执行此操作时,我的 VM 中没有出现任何错误。它只是坐在那里,光标位于屏幕的左上角。有什么想法吗?如果有人认为有帮助,我可以制作一个 objdump -d

好的,在一些有用的评论之后,我可能会进行完整的组装。像

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

.done:
            pop     %ax
            ret

那应该是 16 位实模式兼容的,可以用 GAS 汇编,据我了解,GAS 在编译 16 位程序方面比 GCC 更好。

我认为你没有抓住重点。问题不在于您的汇编代码;问题是 "int 10" 是一个 BIOS

如果您已经启动到 OS(例如 Windows 或 Linux),那么您的 x86 CPU 在 "protected mode";并且您可能无法从用户 space 访问 int 10 ...除非像 Windows 命令提示符之类的东西为您模拟它。

就一般的Linux/assembly编程而言,我强烈推荐这个(免费,在线,非常好) 书:

Programming from the Ground Up, Jonathan Bartlett

感谢您澄清您正在撰写 "boot loader"。强烈建议 1:从 USB 记忆棒启动您的自定义代码,或创建虚拟 DOS 软盘来启动 DOS VM(例如 VMWare 或 VBox VM)。

这里有一些教程: