【问题标题】:Console in the x86 programx86 程序中的控制台
【发布时间】:2012-06-13 17:47:36
【问题描述】:
.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

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

后记

组装选项(winAsm):

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

链接器选项

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

【问题讨论】:

  • 什么汇编程序?你链接了吗?
  • winAsm ,我按下了“Go All”按钮
  • 这是一个链接器问题,您没有正确指定/SUBSYSTEM。
  • 我在后记中列出的选项中的值是默认值。 @Hans Passant 你确定吗?

标签: windows assembly console x86


【解决方案1】:
/SUBSYSTEM:WINDOWS

现在可以回答了。这是错误的选项,它声明该程序是本机 Windows 程序。它负责使用 CreateWindow() api 函数创建自己的窗口。您当然也可以从汇编程序中调用它,只是通常不这样做。您至少要使用 C 编译器来完成创建窗口类和正确编写窗口过程的繁琐工作。就像 Petzold 在他开创性的“Programming Windows”一书中向我们展示的那样。

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

/SUBSYSTEM:CONSOLE

【讨论】:

  • 添加了代码块。不过,有两个 cmets:Iczelion 有相当不错的使用 windows 的汇编程序示例,而您在答案中使用“本机”实际上在参考 /subsystem:windows 时相当混乱,因为那是 Win32 子系统,而 /subsystem:native (存在)不需要用于驱动程序、KM DLL 甚至原生 UM 应用程序(例如 autochk.exe)的任何子系统(有时称为“本地子系统”,尽管 - 即使是 MS)。
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2012-06-20
  • 2015-08-23
  • 2014-08-16
  • 1970-01-01
相关资源
最近更新 更多