2015-12-14 63 views
0

我目前正在从NASM编译一个简单的I/O的控制台应用程序,但即使它编译和链接,当我运行它崩溃。这里是代码:NASM ReadConsoleInput

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    resb 32 

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 NULL 
push 1 
push buffer2 
push dword [consoleInHandle] 
call ReadConsoleInputA 

exit: 

push NULL 
call ExitProcess 

任何线索?我的方式在运行64和Windows 10的机器,我使用NASM汇编和GoLink用于连接

+0

这是一个64位程序?如果是这样,[你没有遵循amd64调用约定](https://msdn.microsoft.com/en-us/library/ms235286.aspx)。 ([详细信息](https://blogs.msdn.microsoft.com/oldnewthing/20040114-00/?p=41053/)) – andlabs

+0

我猜,虽然使用的是64位Windows的意图是目标32位可执行文件与此? –

+0

的[ReadConsoleInput该* lpNumberOfEventsRead *参数(https://msdn.microsoft.com/en-us/library/windows/desktop/ms684961.aspx)是不可选的。你必须传递一个有效的指针。 – IInspectable

回答

1

我假设你的目标32位Windows可执行文件。您可致电ReadConsoleInputA,但如果您只是对从键盘输入的字符感兴趣,则可能更简单地拨打ReadConsoleA。你问题的标题是ReadConsole Input(两者之间的空白使我感到困惑)。您的代码是:

push STD_INPUT_HANDLE 
call GetStdHandle 
mov [consoleInHandle],eax 
push NULL 
push 1 
push buffer2 
push dword [consoleInHandle] 
call ReadConsoleInputA 

ReadConsoleA在本质上是类似的,但处理只是键盘数据。代码看起来是这样的:

push STD_INPUT_HANDLE 
call GetStdHandle 
mov [consoleInHandle],eax 
push NULL 
push buffer ; Pointer to a DWORD for number of characters read to be returned 
push 1 
push buffer2 
push dword [consoleInHandle] 
call ReadConsoleA 

虽然ReadConsoleInputA从控制台读取字符数据,它可以处理,你必须正确地处理其他事件(包括鼠标,菜单,对焦和键盘)的大量(或忽略)。

我假设它正在与内置的命令来生成32位可执行文件是这样的:

nasm -f win32 test.asm -o test.obj  
GoLink.exe /console test.obj kernel32.dll 

如果你想针对64位可执行文件,然后所有的代码都会有,因为改变64位调用约定在寄存器中传递许多参数,而不是在堆栈上。

+0

虽然它是真的,但[ReadConsole](https://msdn.microsoft.com/en-us/library /windows/desktop/ms684958.aspx)采用5个参数,无论您的代码,以及问题的呼叫[ReadConsoleInput(https://msdn.microsoft.com/en-us/library/windows/desktop/ms684961.aspx)采取4个论据。 – IInspectable

+0

请再次阅读我的评论。 – IInspectable

+0

您的代码将5个参数传递给期望为4的API。请再次阅读我的第一条评论,并进行尽职调查。 – IInspectable