C Inline Asm Int 0x10

时间:2015-07-01 01:24:26

标签: c gcc assembly x86-16 bootloader

我正在尝试编写一个在C中打印字符串的函数。它用于启动加载程序,因此没有外部库或任何链接的内容。这是我的功能:< / p>

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

2 个答案:

答案 0 :(得分:1)

好的,在一些有用的评论之后,我可能只是进行全面组装。像

这样的东西
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组装,据我所知,它比GCC更适合编译16位程序。

答案 1 :(得分:0)

我认为你错过了这一点。问题不在于汇编代码;问题是“int 10”是一个BIOS

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

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

Programming from the Ground Up, Jonathan Bartlett

感谢您澄清您正在编写“引导加载程序”。强烈建议1:从USB记忆棒启动自定义代码,或创建虚拟DOS软盘以启动DOS VM(例如VMWare或VBox VM)。

以下是一些教程: