2

我在 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 所以我调用 assemble source 并汇编可执行文件。

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

在视频教程中,这个人组装了他的程序并编译并运行良好,但对我来说什么也没发生。

4

3 回答 3

1

我解决了这个问题。

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

于 2011-06-14T22:25:46.893 回答
0

至少通常是标准输入和输出StdInStdOut句柄要读/写,您需要调用像ReadFileand之类的函数WriteFile,传递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
于 2011-06-14T21:48:53.940 回答
0

在 MODEL flat 语句之后添加:

includelib  \masm32\lib\kernel32.lib   ;fixed the problem!
于 2018-07-31T06:22:23.947 回答