Winapi 使用masm(汇编代码)将简单字符串写入控制台
我想使用writeconsole API在控制台输出中编写一个字符串,但它不起作用 我使用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
.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还是新版本时编写的类似内容(但仍在工作)进行了比较,这是我第一次看到明显的区别,但是的,这可能在我的代码中是不必要的。