programme d'assemblage masm32 ne fonctionne pas comme prévu
-
27-10-2019 - |
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.
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!