键盘处理程序导致段错误 (djgpp)
Keyboard handler causes segfault (djgpp)
最近我决定编写一些简单的 MSDOS 游戏,这会很有趣。不用说,我需要处理键盘事件的代码。
这是我想出的测试:
int i, c = 0;
for ( i = 0; i < 10; i++ )
{
asm
(
"mov [=10=]x00, %%ah \n"
"mov [=10=]x00, %%al \n"
"int [=10=]x16 \n"
//"jnz keydn \n"
//"mov [=10=]x00, %%al \n"
//"keydn: \n"
"movw %%ax, (%0) \n"
: "=r"(c)
);
printf( "%d\n", c & 0xFF );
}
代码应该等待按键,然后打印出字符的ASCII值。
一切都按预期进行,除非我按下 backspace 或 esc 之类的键 - 然后发生分段错误。
我不熟悉汇编,但我真的不知道是什么导致了这个错误。
我在 DosBox
中使用 djgpp
和 运行 可执行文件进行编译
一切都基于此处提供的信息:
- 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 给出的地址处写入内存,该地址是输出操作数,因此未初始化。它也不是指针。你可能想做这样的事情:
asm
(
"mov [=10=]x00, %%ah \n"
"mov [=10=]x00, %%al \n"
"int [=10=]x16 \n"
: "=a"(c)
);
PS:学习使用调试器或至少将寄存器转储与您的代码交叉引用。
最近我决定编写一些简单的 MSDOS 游戏,这会很有趣。不用说,我需要处理键盘事件的代码。
这是我想出的测试:
int i, c = 0;
for ( i = 0; i < 10; i++ )
{
asm
(
"mov [=10=]x00, %%ah \n"
"mov [=10=]x00, %%al \n"
"int [=10=]x16 \n"
//"jnz keydn \n"
//"mov [=10=]x00, %%al \n"
//"keydn: \n"
"movw %%ax, (%0) \n"
: "=r"(c)
);
printf( "%d\n", c & 0xFF );
}
代码应该等待按键,然后打印出字符的ASCII值。 一切都按预期进行,除非我按下 backspace 或 esc 之类的键 - 然后发生分段错误。
我不熟悉汇编,但我真的不知道是什么导致了这个错误。
我在 DosBox
djgpp
和 运行 可执行文件进行编译
一切都基于此处提供的信息:
- 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 给出的地址处写入内存,该地址是输出操作数,因此未初始化。它也不是指针。你可能想做这样的事情:
asm
(
"mov [=10=]x00, %%ah \n"
"mov [=10=]x00, %%al \n"
"int [=10=]x16 \n"
: "=a"(c)
);
PS:学习使用调试器或至少将寄存器转储与您的代码交叉引用。