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

Winapi 使用masm(汇编代码)将简单字符串写入控制台,winapi,assembly,masm,masm32,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

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

空输出


因此,任何通知

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

一个明显的问题是您没有定义堆栈:

.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
返回它。对于一个非常重要的程序来说,将其保存在内存中通常是正确的做法。

谢谢尼尔的解释:)链接器不是为您定义了一个默认1MB堆栈吗,您可以使用
链接/堆栈来覆盖它的大小吗?@Neil:可能--我不确定,可以马上就定义。我基本上只是浏览了他的代码,并将其与几年前我在Win32还是新版本时编写的类似内容(但仍在工作)进行了比较,这是我第一次看到明显的区别,但是的,这可能在我的代码中是不必要的。