2016-10-12 3 views
-1

Je suis maintenant en train de programmer un assemblage natif de Windows, en utilisant NASM 2.12.01 et GCC 4.8.1 comme éditeur de liens.Win32 Assembly - WriteFile() à la console n'affiche pas la sortie

Cependant, ce simple programme HelloWorld compile les liens & sans aucune plainte, mais ne génère rien à l'écran de la console.

Il semble que GetStdHandle ne renvoie pas un handle valide à une console en cours, de sorte que la sortie ne s'affiche pas.

Mais le problème pourrait être un autre.

code:

; Name:  hello.asm 
; Assemble: nasm.exe -fwin32 hello.asm 
; Link:  gcc -mwindows -o hello hello.obj -lkernel32 -lmsvcrt 
; Run:  a.exe 

BITS 32 
extern [email protected] 
extern [email protected] 
extern [email protected] 
extern __getch 
extern _puts 

SECTION .data 
    str: db `Hello world!\n`   ; C-like strings in NASM with backticks 
    strlen equ $-str 
    pause: db "Do you know where the ANY key is? :-)",0 

SECTION .text 
GLOBAL _main 
_main: 
; Stack frame for NumberOfBytesWritten 
push ebp 
sub esp, 4 

; http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231.aspx 
; HANDLE WINAPI GetStdHandle(
; _In_ DWORD nStdHandle 
;); 
push -11 
call [email protected] 

; http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx 
; BOOL WINAPI WriteFile(
; _In_   HANDLE hFile, 
; _In_   LPCVOID lpBuffer, 
; _In_   DWORD nNumberOfBytesToWrite, 
; _Out_opt_ LPDWORD lpNumberOfBytesWritten, 
; _Inout_opt_ LPOVERLAPPED lpOverlapped 
;); 
push 0    ; lpOverlapped, 
lea ebx, [ebp-4] ; EBX: address of NumberOfBytesWritten 
push ebx   ; lpNumberOfBytesWritten, 
push strlen   ; nNumberOfBytesToWrite 
push str   ; lpBuffer, 
push eax   ; hFile (result from GetStdHandle 
call [email protected] 

; msvcrt.dll (C library) 
push pause 
call _puts   ; http://msdn.microsoft.com/library/tf52y4t1.aspx 
add esp, 4 
call __getch  ; http://msdn.microsoft.com/library/078sfkak.aspx 

; ExitProcess (0) 
push 0 
call [email protected] 
+0

* "Mais le problème peut être différent." * - Pourquoi ne pas implémenter la gestion des erreurs si seulement pour arrêter de deviner? – IInspectable

+0

@IInspectable Et comment exactement l'implémenteriez-vous dans un programme ASM hello world? – hakeris1010

+0

Existe-t-il un outil Windows capable de suivre tous les appels système effectués par un processus? Sous Linux/Unix, 'strace' est idéal pour déboguer des choses comme ça. (Voir [exemple de sortie dans ce blog aléatoire] (http://www.thegeekstuff.com/2011/11/strace-examples)). –

Répondre

1

Voir la documentation en ligne, section 3.18.55, x86 Windows Options.

Vous utilisez -mwindows qui crée une application graphique. Windows ne crée pas de console ou ne définit pas les poignées standard lors du lancement d'applications graphiques.

+0

Wow! C'est exactement ce que le problème était! Il n'y avait tout simplement pas de poignées de console à créer! – hakeris1010

0

Vous ne configurez correctement le cadre de la pile!

Ce n'est pas la bonne façon:

push ebp 
sub esp, 4 

vous manque quelque chose? Votre pile est foiré!

Le prolouge doit être:

push ebp 
    mov ebp, esp 
    sub esp, 4 

Pour le epilouge, juste renverser cette tendance. Pour générer une application de console, vous devez utiliser l'option -mconsole pour GCC pour

+0

Il n'est pas nécessaire de définir le pointeur de base sur une valeur particulière. C'est purement une commodité, pour accéder plus facilement aux locaux ainsi qu'aux arguments. En fait, l'omission du pointeur de trame est l'une des optimisations les plus courantes pour tout compilateur de langage de haut niveau. Je suis désolé, mais cela ne répond pas à la question (je ne sais pas qui a voté ceci ou pourquoi). – IInspectable