2011-06-14 107 views
2

我有以下来源,我在一个YouTube视频教程有一个汇编程序:MASM32汇编程序无法正常运行

.386 
.model flat, stdcall 
option casemap:none 

include c:\masm32\include\windows.inc 
include c:\masm32\include\masm32.inc 
include c:\masm32\include\kernel32.inc 

includelib c:\masm32\lib\masm32.lib 
includelib c:\masm32\lib\kernel32.lib 

.data 
message1 db "Type your name: ", 0 
message2 db "Your name is ", 0 

.data? 
buffer db 100 dup(?) 

.code 
start: 

invoke StdOut, addr message1 
invoke StdIn, addr buffer, 100 
invoke StdOut, addr message2 
invoke StdOut, addr buffer 

invoke StdIn, addr buffer, 100 
invoke ExitProcess, 0 

end start 

我编译程序用一个bat文件

ml /c /coff %1.asm 
Link /SUBSYSTEM:WINDOWS %1.OBJ 

我称之为bat文件assemble.bat,所以我调用汇编源代码,它汇编了可执行文件。

问题是,当我运行程序(该程序安装正常,没有错误),该程序根本不做任何事情。我在控制台提示符下调用它,它什么也不做,程序只是显示一个空白行并返回到命令提示符,就好像没有任何事情发生一样。

在视频教程中,这个人组装了他的程序并编译并工作正常,但对于我来说没有任何反应。

回答

1

我解决了这个问题。

它不工作,因为我正在链接命令“Link/SUBSYSTEM:WINDOWS%1.OBJ” 对于控制台应用程序,链接命令应该是“Link/SUBSYSTEM:CONSOLE%1.OBJ”。

0

至少正常StdInStdOut句柄以标准输入和输出。要读取/写入,您需要调用ReadFileWriteFile等功能,将StdInStdOut作为参数分别指定要读取/写入的文件。

编辑:这里有一个简单的例子:

.386 
.MODEL flat, stdcall 

getstdout = -11 

WriteFile PROTO NEAR32 stdcall, \ 
     handle:dword,   \ 
     buffer:ptr byte,  \ 
     bytes:dword,   \ 
     written: ptr dword,  \ 
     overlapped: ptr byte 

GetStdHandle PROTO NEAR32, device:dword 

ExitProcess PROTO NEAR32, exitcode:dword 

.stack 8192 

.data 
message db "Hello World!" 
msg_size equ $ - offset message 

.data? 
written dd ? 

.code 
main proc 
    invoke GetStdHandle, getstdout 
    invoke WriteFile,     \ 
      eax,       \ 
      offset message,    \ 
      msg_size,     \ 
      offset written,    \ 
      0 
    invoke ExitProcess, 0 
main endp 
     end main 
+0

但我不想读取或写入文件。它旨在获取和显示控制台中的数据。 – Victor 2011-06-14 21:53:15

+0

@Victor:控制台的手柄仍然像文件手柄一样工作。您也可以*将它们传递给特殊的控制台函数(例如,'ReadConsoleInput','WriteConsoleOutput'),但由于您只是想显示简单的文本而不关心更改文本颜色等内容,因此'ReadFile'/WriteFile'更容易。 – 2011-06-14 21:56:10

+0

这里的问题是代码应该工作。它与视频教程中的代码相同,并且应该正在运行。你是说如果我使用ReadConsoleInput和WriteConsoleOutput,程序将按预期运行?如果是这样,我该如何使用这个功能?该程序组装好,但是当我运行它时没有任何反应。 – Victor 2011-06-14 21:59:36