Question

J'ai la source suivante pour un programme de montage que je suis arrivé dans un tutoriel vidéo 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

Je compile le programme avec un fichier de chauve-souris

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

J'appelle le fichier de chauve-souris assemble.bat donc j'appelle assembler la source et il assemble l'exécutable.

Le problème est que lorsque je lance le programme (le programme assemble fin sans erreur) le programme ne fonctionne tout simplement rien. Je l'appelle à l'invite de la console et il ne fonctionne tout simplement rien, le programme montre juste une ligne vide et retourne à l'invite de commande comme si rien ne se passait.

Dans le tutoriel vidéo le gars assemblé son programme et compilé et a bien fonctionné, mais pour moi rien ne se passe.

Était-ce utile?

La solution

Je résolu le problème.

Il ne fonctionnait pas parce que je suis la liaison avec la commande « Link / SUBSYSTEM: WINDOWS% 1.OBJ » Pour les applications de la console la commande reliant devrait être "Link / SUBSYSTEM: CONSOLE% 1.OBJ".

Autres conseils

Au moins normalement StdIn et StdOut seront les poignées à l'entrée et la sortie standard. Pour lecture / écriture, vous auriez besoin d'invoquer des fonctions telles que ReadFile et WriteFile, en passant StdIn ou StdOut comme paramètres désignant le fichier en lecture / écriture, respectivement.

Edit: voici un court exemple:

.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

Ajoutez juste après la déclaration de plat du modèle:

includelib  \masm32\lib\kernel32.lib   ;fixed the problem!
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top