0

最近我决定编写一些简单的 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 值。并且一切都按预期工作,除非我按喜欢backspaceesc- 然后发生分段错误。

在此处输入图像描述

我对装配不熟悉,但我真的不知道是什么原因导致了这个错误。

我用 编译djgpp并运行可执行文件DosBox

一切都基于此处提供的信息:

先感谢您!:)

4

1 回答 1

3

这肯定是坏的:movw %%ax, (%0): "=r"(c) 它试图在操作数 0 给定的地址写入内存,这是一个输出操作数,因此未初始化。它也不是指针。您可能想要执行以下操作:

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

PS:学习使用调试器或至少使用您的代码交叉引用寄存器转储。

于 2016-06-23T16:14:30.297 回答