2011-06-14 2 views
2

je la source suivante pour un programme de montage que je suis arrivé dans un tutoriel vidéo Youtube:programme d'assemblage MASM32 ne fonctionne pas comme prévu

.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 compilez le programme avec un fichier bat

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

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

Le problème est que lorsque j'exécute le programme (le programme s'assemble correctement sans erreur), le programme ne fait simplement rien. Je l'appelle dans l'invite de la console et il ne fait simplement rien, le programme affiche simplement une ligne vide et retourne à l'invite de commande comme si rien ne se passait.

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

Répondre

1

Je résolu le problème.

Cela ne fonctionnait pas parce que je liaient avec la commande "Link/SUBSYSTEM: WINDOWS% 1.OBJ" Pour les applications console, la commande de liaison doit être "Link/SUBSYSTEM: CONSOLE% 1.OBJ".

0

Au moins normalement StdIn et StdOut sera le gère à l'entrée et la sortie standard. Pour lire/écrire, vous devez appeler des fonctions comme ReadFile et WriteFile, en passant StdIn ou StdOut en tant que paramètres désignant le fichier à lire/écrire 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 
+0

mais je ne veux pas lire ou écrire dans des fichiers. Il est destiné à obtenir et afficher des données dans la console. – Victor

+0

@Victor: Les poignées de la console fonctionnent toujours comme des poignées de fichiers. Vous pouvez également les passer à des fonctions spéciales de la console (par exemple 'ReadConsoleInput',' WriteConsoleOutput'), mais puisque vous voulez juste afficher du texte simple et ne pas vous soucier de choses comme changer la couleur du texte, 'ReadFile' /' WriteFile' sont plus faciles. –

+0

Le problème ici est que le code devrait fonctionner. C'est le même code que dans le didacticiel vidéo, et il devrait être en cours d'exécution. Voulez-vous dire que si j'utilise ReadConsoleInput et WriteConsoleOutput, le programme fonctionnera comme prévu? Si c'est le cas, comment utiliser ces fonctions? Le programme se monte bien mais quand je cours il ne se passe rien. – Victor

Questions connexes