2012-03-27 47 views
0

我創建了一個名爲t.exe的masm程序,它假設從cmd讀取輸入並輸出它。 我知道他們可能是另一種方法來做到這一點,但我想它使用`Readconsole當從控制檯讀取時發生崩潰 - masm32

使`這裏是代碼:

.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
include \masm32\include\masm32.inc 
includelib \masm32\lib\masm32.lib 

STD_INPUT_HANDLE EQU -10 

.data? 
ByteAry dd 8 dup (?) 
var dd ? 
.code 
start: 
invoke GetStdHandle, STD_INPUT_HANDLE 
invoke ReadConsole,eax,offset ByteAry,sizeof ByteAry,offset var,0 
invoke StdOut,ByteAry 
invoke ExitProcess,0 
end start 

我嘗試運行它,但我有一個微軟的錯誤和程序退出(「t.exe遇到問題,需要關閉,我們很抱歉給您帶來不便」)。 其實如果有人知道一本好書,開始與MASM ...我需要它,因爲我有數據類型而奮鬥,並請沒有進攻的意見:)

+0

+0.49只是爲了不打擾與16位廢話。有人意識到這是21世紀。 :)雖然你確實需要將錯誤信息添加到你的文章中。 – cHao 2012-03-27 19:13:10

+0

C:\ masm32> t.exe hello C:\ masm32> t.exe遇到問題需要關閉。對此造成的不便,我們表示歉意。 – 2012-03-27 19:58:50

+0

我想要當我輸入t.exe你好 它會輸出你好,但不幸的是我得到了上面的錯誤 – 2012-03-27 19:59:52

回答

1

使用WinAPI的功能ReadConsole和WriteConsole您的代碼:

.586 
.model flat, stdcall 

option casemap:none 

include windows.inc 
include kernel32.inc 

includeLib kernel32.lib 

.data 

.data? 
consoleOutHandle dd ? 
consoleInHandle dd ? 
bytearray db 32 dup(?) 
ReadWritten dd ? 

.code 

start: 
push STD_OUTPUT_HANDLE 
call GetStdHandle 

mov consoleOutHandle, eax 

push STD_INPUT_HANDLE 
call GetStdHandle 

mov consoleInHandle, eax 

push 0 
push offset ReadWritten 
push sizeof bytearray 
push offset bytearray 
push consoleInHandle 
call ReadConsole 

push 0 
push offset ReadWritten 
push sizeof bytearray 
push offset bytearray 
push consoleOutHandle 
call WriteConsole 

push 0 
call ExitProcess 

end start