3

我想使用 writeconsole API 在控制台输出中写入一个字符串,但它不起作用我使用 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>

空输出

所以任何建议

4

2 回答 2

1

第三个参数是要写入的字符数,而不是要写入的字符数的地址。幸运的是,地址超过 64K,导致调用失败,错误代码为 ERROR_NOT_ENOUGH_MEMORY。

于 2012-03-25T23:17:50.143 回答
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

请注意,我没有将标准输出句柄保存到内存中,而是直接从GetStdHandle返回它的 EAX 传递它。对于不平凡的程序,将其保存在内存中通常是正确的做法。

于 2012-03-25T23:18:30.783 回答