最近我决定,编写一些简单的MSDOS游戏会很有趣。我需要处理键盘事件的代码。
这就是我想做的测试:

int i, c = 0;
for ( i = 0; i < 10; i++ )
{
    asm
    (
        "mov $0x00, %%ah         \n"
        "mov $0x00, %%al         \n"
        "int $0x16               \n"
        //"jnz keydn             \n"
        //"mov $0x00, %%al       \n"
        //"keydn:                \n"
        "movw %%ax, (%0)         \n"
            : "=r"(c)
    );

    printf( "%d\n", c & 0xFF );
}

代码应该等待按键,然后打印出字符的ASCII值。
除非我按backspace或esc键,否则一切都按预期工作-然后出现分段错误。
c - 键盘处理程序导致segfault(djgpp)-LMLPHP
我不熟悉汇编,但我真的不知道是什么导致了这个错误。
我用djgpp编译,并在DosBox中运行可执行文件
一切都基于这里提供的信息:
https://courses.engr.illinois.edu/ece390/books/artofasm/CH20/CH20-3.html
https://en.wikipedia.org/wiki/BIOS_interrupt_call
提前谢谢你!:)

最佳答案

这个肯定坏了:movw %%ax, (%0): "=r"(c)
它试图在操作数0给定的地址写入内存,操作数0是输出操作数,因此未初始化。也不是指针。你可能想做些什么:

   asm
    (
        "mov $0x00, %%ah         \n"
        "mov $0x00, %%al         \n"
        "int $0x16               \n"
            : "=a"(c)
     );

注意:学习使用调试器或至少将寄存器转储与代码交叉引用。

10-08 12:07