gpt4 book ai didi

c - 键盘处理程序导致段错误 (djgpp)

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:19 25 4
gpt4 key购买 nike

最近我决定编写一些简单的 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 之类的键 - 然后发生段错误。

enter image description here

我不熟悉汇编,但我真的不知道是什么导致了这个错误。

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

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

提前致谢! :)

最佳答案

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

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

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

关于c - 键盘处理程序导致段错误 (djgpp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37996780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com