2012-03-25 102 views
3

我想用writeconsole API來編寫在控制檯輸出字符串,但它不工作 我鏈接,並使用控制檯在MASM編寫簡單的字符串使用MASM(彙編代碼)

這裏是構建它安慰代碼

.386 
.MODEL Flat,STDCALL 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 

STD_OUTPUT_HANDLE EQU -11 

.DATA 
Msg db "Hello World",13,10,0 
lmessage dd 13 

.DATA? 

consoleOutHandle dd ? 
bytesWritten dd ? 

.code 
start: 
INVOKE GetStdHandle, STD_OUTPUT_HANDLE 
mov [consoleOutHandle],eax 

invoke WriteConsole, consoleOutHandle,offset Msg,offset lmessage,offset bytesWritten,0 
INVOKE ExitProcess,0 
end start 
當我運行exe輸出

我得到了以下

C:\ MASM32> 18.exe

C:\ MASM32>

空輸出中

所以任何建議

回答

1

第三個參數是要寫入的字符數,要被寫入的字符數的不地址。幸運的是,地址竟然超過了64K,導致調用失敗,錯誤代碼爲ERROR_NOT_ENOUGH_MEMORY。

+0

感謝Neil對你的解釋:) – 2012-03-26 06:59:42

0

一個明顯的問題是,你還沒有定義堆棧:

.stack 8192 

需要的.MODEL指令後去,但在其他位置也無所謂了很多。由於您使用的堆棧空間很小,您可能只需要4096個字節,但兩種方式都不會有太大的區別。

當您調用WriteFile時,還需要傳遞要寫入的實際數據大小。我通常會計算它,是這樣的:

message db "Hello World!", 13, 10 
msg_size equ $ - offset message 

; ... 

invoke WriteFile,     \ 
     eax,       \ 
     offset message,    \ 
     msg_size,     \ 
     offset written,    \ 
     0 

注意,而不是保存在標準輸出句柄到內存中,我只是通過它直接從eax,其中GetStdHandle返回。對於一個非平凡的程序,將其保存在內存中通常是正確的。

+0

謝謝你們 它現在在工作 – 2012-03-26 06:55:12

+0

不管鏈接器是否爲你定義了一個默認的1MB堆棧,你可以使用'link/stack'來覆蓋它的大小? – Neil 2012-03-26 23:06:01

+0

@尼爾:也許 - 副手,我不確定。我基本上只是掃描了他的代碼,並與幾年前Win32是新的時候寫的相似(但工作)相比,這是我看到的第一個明顯的區別,但是,在我的代碼中可能沒有必要。 – 2012-03-26 23:15:54