使用 masm 将简单字符串写入控制台(汇编代码)
Posted
技术标签:
【中文标题】使用 masm 将简单字符串写入控制台(汇编代码)【英文标题】:Writing simple string to console using masm (assembly code) 【发布时间】:2012-03-25 23:03: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>
空输出
有什么建议
【问题讨论】:
【参考方案1】:第三个参数是要写入的字符数,而不是要写入的字符数的地址。幸运的是,地址超过 64K,导致调用失败,错误代码为 ERROR_NOT_ENOUGH_MEMORY。
【讨论】:
感谢尼尔的解释 :)【参考方案2】:一个明显的问题是您还没有定义堆栈:
.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 堆栈,您可以使用link /stack
覆盖其大小?
@Neil:也许——我不确定。我基本上只是浏览了他的代码,并与几年前我在 Win32 新版本时编写的类似(但工作)的东西进行了比较,这是我看到的第一个明显差异,但是是的,在我的代码中可能没有必要。跨度>
以上是关于使用 masm 将简单字符串写入控制台(汇编代码)的主要内容,如果未能解决你的问题,请参考以下文章