2012-03-25 68 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