C Inline Asm Int 0x10



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

void printString(const char* pStr) {
    while(*pStr) {
        __asm__ __volatile__ (
            "movb 0x0e, %%ahn"
            "movb %[c], %%aln"
            "int $0x10n"
            : 
            : [c] "r" (*pStr)
            : "ax"
        );
        ++pStr;
    }
}

当我运行这个程序时,我的虚拟机中不会出现任何错误。它只是放在那里,光标在屏幕的左上角。有什么想法吗?如果有人认为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 
            je      .done
            int     $0x10           # Call interrupt
            jmp     .loop
.done:
            pop     %ax
            ret

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

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

如果您已经启动到操作系统(例如Windows或Linux),那么您的x86 CPU正在"保护模式"下运行;并且您可能无法从用户空间访问int 10。。。除非像Windows命令提示符这样的东西为您模拟它。

就Linux/汇编编程而言,我强烈推荐这本书(免费、在线、非常好):

从头开始编程,Jonathan Bartlett

感谢您澄清您正在编写一个"引导加载程序"。强烈建议1:从U盘启动自定义代码,或者创建一个虚拟DOS软盘来启动DOS虚拟机(例如VMWare或VBox虚拟机)。

以下是一些教程:

  • http://www.codeproject.com/Articles/36907/How-to-develop-your-own-Boot-Loader

  • https://cs.au.dk/~架次/dopsys/osdev/

  • http://wiki.osdev.org/Rolling_Your_Own_Bootloader

最新更新