我在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,所以我调用汇编源代码并组装可执行文件。
问题在于,当我运行程序时(程序组装好没有错误)程序根本什么都不做。我在控制台提示符中调用它并且它什么都不做,程序只显示一个空行并返回命令提示符,好像什么也没发生。
在视频教程中,这个人组装了他的程序并编译并运行良好,但对我来说没有任何反应。
答案 0 :(得分:1)
我解决了这个问题。
它无法正常工作,因为我正在使用命令“Link / SUBSYSTEM:WINDOWS%1.OBJ”进行链接 对于控制台应用程序,链接命令应为“Link / SUBSYSTEM:CONSOLE%1.OBJ”。
答案 1 :(得分:0)
至少通常StdIn
和StdOut
将是标准输入和输出的句柄。要读/写,您需要调用ReadFile
和WriteFile
等函数,并将StdIn
或StdOut
作为指定文件分别读/写的参数。
编辑:这是一个简短的例子:
.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!