Windows Win32 ASM程序不向命令行打印任何内容

Windows Win32 ASM程序不向命令行打印任何内容,windows,winapi,assembly,command-line,x86,Windows,Winapi,Assembly,Command Line,X86,我试图用Win32 API在汇编中编写一个简单的命令行程序。我编写了下面的代码,让它编译并链接到零错误或警告,然后从命令行启动它,但命令提示符下没有显示任何内容。任何人都能看到出了什么问题,或者在命令行中说“Hello World!”会有什么问题吗?该方案: ; Block 1 .386 .model flat,stdcall option casemap:none ; Block 2 include windows.inc include user32.inc includelib user

我试图用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

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

是否尝试过调试?您发现了什么?传递给
WriteConsole
的参数错误。第一个参数应该是控制台输出缓冲区的句柄,第四个参数应该是指向写入字符数的指针(您正在传递值)。我将该行更改为
invoke WriteConsole、STD_output\u handle、addr szMsg、nNumToWrite、addr numwrited、NULL
,但仍然没有乐趣。@tenfour我可以单步通过,但是,由于我不知道Windows控制台程序如何在底层正确地将字符放在终端屏幕上,我不知道我看到的是不是应该的,尤其是在浏览Win32 API函数的内部时。
invoke GetStdHandle,STD_OUTPUT_HANDLE
/
mov hOut,eax
/
调用WriteConsole、hOut、addr saMsg、nNumToWrite、addr numwrited、NULL
适合我。如果您的应用程序是GUI应用程序(/SUBSYSTEM:WINDOWS),您可能必须首先调用
alloconsole
。我正在使用WinAsm。创建项目时,我确实将该项目作为标准EXE。我尝试在WinAsm中创建一个新项目,并选择Console应用程序作为项目类型,使用相同的代码进行构建,得到了相同的结果。