2015-12-14 28 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