2015-12-23 4 views
1

J'essaie d'imprimer la valeur d'un compteur qui s'incrémente dans une boucle while, c'est juste une partie d'une plus grande fonction sur laquelle je travaille un projet, voici comment j'augmente la valeur de la variable de compteur et essaye de l'imprimer, à cause de la façon dont j'appelle la fonction printf je crois que je dois pousser les variables char [] avec ce que je veux imprimer sur le pile, j'ai essayé de pousser les valeurs du compteur directement à imprimer (en utilisant "push edx" directement au lieu de stocker l'adresse d'une variable char [] et en le poussant) et il recrache simplement des nombres aléatoires probablement l'adresse mémoire de la valeur ou quelque chose, la façon dont l'appel de fonction d'impression est configuré fonctionne correctement lorsque j'imprime les variables char [] pour lesquelles j'ai déjà spécifié le contenu lorsque je les déclare avant la balise _asm (par exemple "char text [4] ="% s \ n ""), j'apprécierais vraiment votre aide, je peux poster toute la fonction aussi si nécessaire être.Comment imprimer sur l'écran la valeur d'un compteur masm32

 _calcGravedad: 
     mov edx, G  // G stored in edx 
     inc edx   //increases edx 
     mov G, edx  //returns edx to G 

    //here I try to convert my int G variable (the counter) into a char[] 
    //so i can print it, I'm not sure of this part, it doesnt work 
     lea eax, G   //stores memory addres of G into eax 
     push eax    //push eax into the stack 
     call byte ptr _itoa_s //calls the conversion function from c 
     pop edx    //transfers the result to edx 
     mov gravedad, edx  //moves the result to a char[] variable 

    //here's the print function call 
     lea eax, gravedad //get address of gravedad 
     push eax   //push it into the stack 
     lea eax, texto  //push the print format "%s\n" onto the stack 
     push eax   //  
     call DWORD ptr printf //calls the print function 
     pop edx     //cleans the stack 
     pop edx     // 
+0

Vous devriez appeler le noyau OS via un appel système, 'write' –

+0

@self: Faire un _syscall_ directement sur les plates-formes Win32/Win64 est généralement mal vu puisque MS a été connu pour les changer au fil du temps. L'appel de fonctions dans kernel32.dll et user32.dll qui enveloppent les appels système est préférable, ou dans ce cas appelant la bibliothèque _C_ qui est une autre couche d'abstraction. Peut-être que vous pensiez plutôt à Linux/BSD etc? –

Répondre

0

Je ne suis pas sûr pourquoi vous avez besoin de l'adresse de G plutôt que sa valeur, ou pourquoi vous avez besoin de deux appels de bibliothèque. Pourquoi ne pas passer votre valeur de compteur directement à printf avec un format %d au lieu du format %s?

Je n'ai pas travailler masm mais cela ne devrait illustrer (MSVC):

#include <stdio.h> 

int main(void) 
{ 
    int G = 42; 
    char *fmt = "%d\n"; 
    __asm { 
     mov eax,G  ;counter value 
     push eax 
     mov eax,fmt  ;format argument 
     push eax 
     call printf 
     pop eax 
     pop eax   
    } 
    return 0; 
} 

Sortie de la console:

42 

Vous pourriez avoir besoin d'une instruction mov différente pour la chaîne de format, tel que lea eax,fmt ou mov eax,offset fmt. Notez également que vous n'avez pas besoin de qualifier les appels de fonction de bibliothèque comme vous le faites.

+0

Merci beaucoup! ça a marché! et vous avez raison sur la façon dont je fais les appels de fonction. – atf01