最近我决定,编写一些简单的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键,否则一切都按预期工作-然后出现分段错误。
我不熟悉汇编,但我真的不知道是什么导致了这个错误。
我用
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)
);
注意:学习使用调试器或至少将寄存器转储与代码交叉引用。