Masm32装配程序未按预期工作

时间:2011-06-14 21:45:16

标签: assembly console console-application masm masm32

我在Youtube视频教程中获得了汇编程序的以下资源:

.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,所以我调用汇编源代码并组装可执行文件。

问题在于,当我运行程序时(程序组装好没有错误)程序根本什么都不做。我在控制台提示符中调用它并且它什么都不做,程序只显示一个空行并返回命令提示符,好像什么也没发生。

在视频教程中,这个人组装了他的程序并编译并运行良好,但对我来说没有任何反应。

3 个答案:

答案 0 :(得分:1)

我解决了这个问题。

它无法正常工作,因为我正在使用命令“Link / SUBSYSTEM:WINDOWS%1.OBJ”进行链接 对于控制台应用程序,链接命令应为“Link / SUBSYSTEM:CONSOLE%1.OBJ”。

答案 1 :(得分: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

答案 2 :(得分:0)

在MODEL平面语句之后添加:

includelib  \masm32\lib\kernel32.lib   ;fixed the problem!