使用 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 将简单字符串写入控制台(汇编代码)的主要内容,如果未能解决你的问题,请参考以下文章

在汇编 (MASM) 中显示字符串的偶数字符

在汇编代码 (MASM) 中的字符串中查找子字符串的更好形式?

Debug和汇编编译器masm对指令的不同处理

汇编中字符串的长度(对程序如何工作的困惑)

使用 TYPE 指令汇编 MASM x86

MASM6.15汇编程序