3

writeconsole API を使用してコンソール出力に文字列を書き込みたいのですが、うまくいきません。

ここにコードがあります

.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>

空の出力

だから何かアドバイス

4

2 に答える 2

1

3 番目のパラメータは、書き込む文字数のアドレスではなく、書き込む文字数です。幸いなことに、アドレスが 64K を超えていることが判明したため、エラー コード ERROR_NOT_ENOUGH_MEMORY で呼び出しが失敗しました。

于 2012-03-25T23:17:50.143 に答える
0

明らかな問題の 1 つは、スタックを定義していないことです。

.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。ただし、重要なプログラムの場合、メモリに保存することは通常正しいことです。

于 2012-03-25T23:18:30.783 に答える