我想使用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>
空ouput
所以任何建议
答案 0 :(得分:1)
第三个参数是要写入的字符数,而不是要写入的字符数的地址。幸运的是,地址结果超过64K,导致调用失败,错误代码为ERROR_NOT_ENOUGH_MEMORY。
答案 1 :(得分: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
返回它。对于一个非平凡的程序,将其保存在内存中通常是正确的做法。