我是 asm 的新手,试图制作一个简单的 hello world,等待用户按一个键结束。现在,hello world 一切都很好,但是我从中获得的 .exe 控制台程序立即关闭,而我希望它保留在屏幕上,直到用户按下某个键。
现在我遇到的问题是,由于某种原因,程序不断循环,搜索用户输入,但是当我强制关闭程序(^C)时,我可以看到我按下的所有键都写在下一个控制台行上,就像如果它使用了错误的缓冲区(?)
几天来我一直在互联网上寻找修复方法,最后我寻求帮助,因为这让我发疯了^^
我发现的所有内容大多基于int系统或linux下,而我必须处理windows api......
非常感谢,欢迎任何帮助或提示!
Code :
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
NULL equ 0
global start
extern ExitProcess, GetStdHandle, WriteConsoleA, ReadConsoleInputA
section .data
msg db "Hello World!", 13, 10, 0
msg.len equ $ - msg
consoleInHandle dd 1
section .bss
buffer resd 2
buffer2 resd 2
section .text
start:
push STD_OUTPUT_HANDLE
call GetStdHandle
push NULL
push buffer
push msg.len
push msg
push eax
call WriteConsoleA
read:
push STD_INPUT_HANDLE
call GetStdHandle
mov [consoleInHandle],eax
push consoleInHandle
push dword[buffer2]
push 1
push NULL
call ReadConsoleInputA
cmp eax,1
jge exit
jmp read
exit:
push NULL
call ExitProcess
有关 Windows 函数的 Moar 信息可以在这里找到:
push consoleInHandle
推送的是地址,而不是句柄。你要push dword [consoleInHandle]
。相反,对于缓冲区你想传递地址,所以你需要push buffer2
那里。此外,该缓冲区的大小应为INPUT_RECORD
结构,我认为是 32 字节。
Update:正如弗兰克评论的那样,论证顺序也是错误的。
这段代码对我有用(注意我必须添加@xx
由于我的环境设置方式而导致的 stdcall 装饰 - 显然您不需要这些):
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
NULL equ 0
global start
extern ExitProcess@4, GetStdHandle@4, WriteConsoleA@20, ReadConsoleInputA@16
section .data
msg db "Hello World!", 13, 10, 0
msg.len equ $ - msg
consoleInHandle dd 1
section .bss
buffer resd 2
buffer2 resb 32
section .text
start:
push STD_OUTPUT_HANDLE
call GetStdHandle@4
push NULL
push buffer
push msg.len
push msg
push eax
call WriteConsoleA@20
read:
push STD_INPUT_HANDLE
call GetStdHandle@4
mov [consoleInHandle],eax
push NULL
push 1
push buffer2
push dword [consoleInHandle]
call ReadConsoleInputA@16
exit:
push NULL
call ExitProcess@4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)