使用masm(汇编代码)将简单字符串写入控制台

时间:2012-03-25 23:03:12

标签: winapi assembly masm masm32

我想使用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

所以任何建议

2 个答案:

答案 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返回它。对于一个非平凡的程序,将其保存在内存中通常是正确的做法。