繁体   English   中英

C内联Asm 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 $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更好。

我认为您错过了重点。 问题不在于您的汇编代码。 问题是“ int 10”是BIOS

如果您已经引导至某个操作系统(例如Windows或Linux),则您的x86 CPU处于“保护模式”; 并且您可能无法从用户空间访问int 10…除非类似Windows命令提示符的东西为您模拟它。

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

从头开始编程,乔纳森·巴特利特(Jonathan Bartlett)

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

以下是一些教程:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM