【问题标题】:Win32 ASM program prints nothing to command lineWin32 ASM 程序不向命令行打印任何内容
【发布时间】:2013-03-20 16:43:53
【问题描述】:

我正在尝试使用 Win32 API 在汇编中编写一个简单的命令行程序。我写了以下内容,让它编译和链接为零错误或警告,并从命令行启动它,但在命令提示符下没有出现任何内容。任何人都可以看到有什么问题或者是什么让它说“Hello World!”在命令行?程序:

; Block 1
.386
.model flat,stdcall
option casemap:none

; Block 2
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

; Block 3
.data
szMsg db "Hello World!",0
nNumToWrite dd 12

; Block 4
.data?
numwritten dd ?
CommandLine LPSTR ?

; Block 5
.code
start:
invoke GetCommandLine
mov CommandLine,eax
invoke WriteConsole,CommandLine,addr szMsg,nNumToWrite,numwritten,NULL
xor eax,eax
invoke ExitProcess,eax
end start

【问题讨论】:

  • 您是否尝试过调试?你发现了什么?
  • 您传递给WriteConsole 的参数错误。第一个参数应该是控制台输出缓冲区的句柄,第四个应该是指向写入的字符数的指针(您正在传递值)。
  • 我把那行改成invoke WriteConsole,STD_OUTPUT_HANDLE,addr szMsg,nNumToWrite,addr numwritten,NULL,但还是不开心。
  • @tenfour 我可以逐步完成,但由于我不知道 Windows 控制台程序如何在终端屏幕上正确放置字符,所以我不知道我所看到的是否是否应该如此,尤其是在涉足 Win32 API 函数的内部时。
  • invoke GetStdHandle,STD_OUTPUT_HANDLE / mov hOut,eax / invoke WriteConsole,hOut,addr saMsg,nNumToWrite,addr numwritten,NULL 为我工作。如果您的应用是 GUI 应用 (/SUBSYSTEM:WINDOWS),您可能必须先调用 AllocConsole

标签: windows winapi assembly command-line x86


【解决方案1】:

您是将其链接为控制台程序还是 GUI 程序?这是 Win32 中可执行文件的属性。

【讨论】:

  • 我正在使用 WinAsm。创建项目时,我确实将该项目作为标准 EXE。我尝试在 WinAsm 中创建一个新项目并选择控制台应用程序作为项目类型并使用相同的代码构建,得到相同的结果。
猜你喜欢
  • 2020-12-30
  • 2021-12-13
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2019-05-26
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多