Программа сборки Masm32 не работает должным образом - PullRequest
2 голосов
/ 15 июня 2011

У меня есть следующий источник для программы сборки, которую я получил в видеоруководстве по 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-файл assembly.bat, поэтому я вызываю ассемблерный источник, и он собирает исполняемый файл.

Проблема в том, что когда я запускаю программу (программа прекрасно собирается без ошибок), программа просто ничего не делает. Я вызываю его в командной строке консоли, и он просто ничего не делает, программа просто показывает пустую строку и возвращается в командную строку, как будто ничего не произошло.

В видеоуроке парень собрал свою программу, скомпилировал и работал нормально, но для меня ничего не происходит.

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Я решил проблему.

Это не работало, потому что я связывался с командой "Link / SUBSYSTEM: WINDOWS% 1.OBJ" Для консольных приложений команда связывания должна быть "Link / SUBSYSTEM: CONSOLE"% 1.OBJ».

0 голосов
/ 31 июля 2018

Добавьте сразу после плоского выражения MODEL:

includelib  \masm32\lib\kernel32.lib   ;fixed the problem!
0 голосов
/ 15 июня 2011

Как минимум обычно 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
...