x86程序中的控制台

时间:2012-06-13 17:47:36

标签: windows assembly console x86

.386
.model  flat, stdcall
option  casemap:none

include windows.inc
include kernel32.inc
include user32.inc

includelib user32.lib
includelib kernel32.lib

Main        proto

.data

hOutput dd 0
bReadWritten dd 0
szText1 db "What's your name?",0

hInput dd 0

szInput db 128 dup(0)



.data?

.code
start:

Invoke Main
Invoke ExitProcess,0

Main proc
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov hOutput, eax

    invoke GetStdHandle,STD_INPUT_HANDLE
    mov hInput, eax

    invoke lstrlen, addr szText1
    invoke WriteFile, hOutput, addr szText1, eax, ADDR bReadWritten, NULL

    invoke ReadFile, hInput, addr szInput, 128, ADDR bReadWritten,0



    ret
Main endp   


end start

执行此程序后没有任何反应。为什么控制台窗口没有出现?

Postscriptum

汇编选项(winAsm):

  

/ Zi / Zd / c / coff / Cp / nologo

链接器选项

  

/ SUBSYSTEM:WINDOWS / DEBUG / DEBUGTYPE:CV /VERSION:4.0 / INCREMENTAL:NO

1 个答案:

答案 0 :(得分:3)

/SUBSYSTEM:WINDOWS

现在它是负责任的。这是错误的选项,声明程序是本机Windows程序。使用CreateWindow()api函数负责创建自己的窗口。你当然也可以从装配程序中调用,但这并不常见。您至少使用C编译器来完成创建窗口类并正确编写窗口过程的严格要求。就像Petzold在他的开创性“编程Windows”一书中向我们展示的那样。

如果您希望Windows为您创建一个控制台窗口,那么您必须要求它:

/SUBSYSTEM:CONSOLE