MASM x64程序调用INT 16h报错:0xC0000005访问违例
x64平台MASM程序调用INT 16h崩溃问题
错误信息
Exception thrown at 0x00007FF73D0D176F in AssemblyGame.exe:
0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
出错代码片段
_GameLoop PROC call _GameInput mov rax, 0h ret _GameLoop ENDP _GameInput PROC ; Check if any key is being pressed mov ah, 01h int 16h ;; <--- 错误触发位置 call DebugPrint jz NO_KEY_PRESSED ; Check which key is being pressed (AL contains ascii character) mov ah, 00h mov ah, 00h int 16h ; Check W key cmp al, 77h ; Lowercase w je W_KEY_PRESSED cmp al, 57h ; Uppercase W je W_KEY_PRESSED ...
问题原因
INT 16h是MS-DOS时代的BIOS中断,用于获取键盘输入,但现代64位Windows完全不支持这类中断调用。在x64模式下执行INT指令会直接触发内存访问违规,导致程序崩溃。
替代方案
在64位Windows平台下,需使用Windows原生API处理键盘输入,推荐两种实用方式:
GetAsyncKeyState函数:适合游戏实时输入检测,可直接获取指定按键的按下/释放状态,示例代码:
需提前在程序中导入; 检测W键是否按下 mov rcx, 57h ; W键的虚拟键码 call GetAsyncKeyState test eax, 8000h ; 检查返回值最高位(1表示按键按下) jnz W_KEY_PRESSEDuser32.dll中的GetAsyncKeyState函数。ReadConsoleInput函数:适用于控制台程序,可捕获包括按键、鼠标在内的详细输入事件。
内容的提问来源于stack exchange,提问作者Joshnaks
相关产品推荐
相关产品推荐

