键盘处理程序导致segfault(djgpp)

时间:2016-06-23 16:10:08

标签: c assembly segmentation-fault dos djgpp

最近我决定,编写一些简单的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 之类的键,否则一切都按预期工作 - 然后发生分段错误。

enter image description here

我不熟悉汇编,但实际上我无法弄清楚可能导致此错误的原因。

我使用djgpp进行编译,并在DosBox

中运行可执行文件

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

提前谢谢! :)

1 个答案:

答案 0 :(得分:3)

这肯定会被打破:System.out.println(Arrays.toString(brobes[0])); 它尝试在操作数0给出的地址写入内存,操作数0是输出操作数,因此未初始化。它也不是指针。你可能想做类似的事情:

movw %%ax, (%0): "=r"(c)

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