2011-06-14 31 views
2

我有以下來源,我在一個YouTube視頻教程有一個彙編程序:MASM32彙編程序無法正常運行

.386 
.model flat, stdcall 
option casemap:none 

include c:\masm32\include\windows.inc 
include c:\masm32\include\masm32.inc 
include c:\masm32\include\kernel32.inc 

includelib c:\masm32\lib\masm32.lib 
includelib c:\masm32\lib\kernel32.lib 

.data 
message1 db "Type your name: ", 0 
message2 db "Your name is ", 0 

.data? 
buffer db 100 dup(?) 

.code 
start: 

invoke StdOut, addr message1 
invoke StdIn, addr buffer, 100 
invoke StdOut, addr message2 
invoke StdOut, addr buffer 

invoke StdIn, addr buffer, 100 
invoke ExitProcess, 0 

end start 

我編譯程序用一個bat文件

ml /c /coff %1.asm 
Link /SUBSYSTEM:WINDOWS %1.OBJ 

我稱之爲bat文件assemble.bat,所以我調用匯編源代碼,它彙編了可執行文件。

問題是,當我運行程序(該程序安裝正常,沒有錯誤),該程序根本不做任何事情。我在控制檯提示符下調用它,它什麼也不做,程序只是顯示一個空白行並返回到命令提示符,就好像沒有任何事情發生一樣。

在視頻教程中,這個人組裝了他的程序並編譯並工作正常,但對於我來說沒有任何反應。

回答

1

我解決了這個問題。

它不工作,因爲我正在鏈接命令「Link/SUBSYSTEM:WINDOWS%1.OBJ」 對於控制檯應用程序,鏈接命令應該是「Link/SUBSYSTEM:CONSOLE%1.OBJ」。

0

至少正常StdInStdOut句柄以標準輸入和輸出。要讀取/寫入,您需要調用ReadFileWriteFile等功能,將StdInStdOut作爲參數分別指定要讀取/寫入的文件。

編輯:這裏有一個簡單的例子:

.386 
.MODEL flat, stdcall 

getstdout = -11 

WriteFile PROTO NEAR32 stdcall, \ 
     handle:dword,   \ 
     buffer:ptr byte,  \ 
     bytes:dword,   \ 
     written: ptr dword,  \ 
     overlapped: ptr byte 

GetStdHandle PROTO NEAR32, device:dword 

ExitProcess PROTO NEAR32, exitcode:dword 

.stack 8192 

.data 
message db "Hello World!" 
msg_size equ $ - offset message 

.data? 
written dd ? 

.code 
main proc 
    invoke GetStdHandle, getstdout 
    invoke WriteFile,     \ 
      eax,       \ 
      offset message,    \ 
      msg_size,     \ 
      offset written,    \ 
      0 
    invoke ExitProcess, 0 
main endp 
     end main 
+0

但我不想讀取或寫入文件。它旨在獲取和顯示控制檯中的數據。 – Victor 2011-06-14 21:53:15

+0

@Victor:控制檯的手柄仍然像文件手柄一樣工作。您也可以*將它們傳遞給特殊的控制檯函數(例如,'ReadConsoleInput','WriteConsoleOutput'),但由於您只是想顯示簡單的文本而不關心更改文本顏色等內容,因此'ReadFile'/WriteFile'更容易。 – 2011-06-14 21:56:10

+0

這裏的問題是代碼應該工作。它與視頻教程中的代碼相同,並且應該正在運行。你是說如果我使用ReadConsoleInput和WriteConsoleOutput,程序將按預期運行?如果是這樣,我該如何使用這個功能?該程序組裝好,但是當我運行它時沒有任何反應。 – Victor 2011-06-14 21:59:36