2016-03-25 1 views
0

J'essaie d'imprimer une simple chaîne de caractères Hello hello à la console dans l'assemblage en ligne. Mon assemblage (ci-dessous) fonctionne parfaitement bien. J'ai essayé de le traduire au mieux en GAS, mais mettre les variables dans les registres à travers un assemblage étendu s'est avéré plutôt difficile. D'après ce que je peux dire, la fonction printmsg ne fait/ne imprime rien.Impression d'un assemblage en ligne

Assemblée:

section .text 
    global _start 

_start: 
    ; Write string to stdout 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, string 
    mov edx, strlen 
    int 0x80 

    ; Exit 
    mov eax, 1 
    mov ebx, 0 
    int 0x80 

section .data 
    string db 'Hello, World!',10 
    strlen equ $ - string 

C:

#include <stdio.h> 
#include <string.h> 

void printmsg(char *msg, int len){ 
    asm( "movl $4, %eax;" 
      "movl $1, %ebx;" 
     ); 
    asm( "movl %1, %%ecx;" 
      "movl %1, %%edx;" 
      : 
      : "c" (msg), "d" (len) 
     ); 
    asm("int $0x80"); 
} 

int main(){ 
    char *msg = "Hello, world!"; 
    int len = strlen(msg); 

    printf("Len is %d\n*msg is %s\n", len, msg); 

    /* Print msg */ 
    printmsg(msg, len); 

    /* Exit */ 
    asm( "movl $1,%eax;" 
      "xorl %ebx,%ebx;" 
      "int $0x80" 
    ); 
} 

Répondre

0

En utilisant l'assemblage par exemple étendu de Michael:

#include <stdio.h> 
#include <string.h> 

void printmsg(char *string, int length){ 

    asm( "int $0x80\n\t" 
      : 
      :"a"(4), "b"(1), "c"(string), "d"(length) 
     ); 

} 

int main(){ 

    char *string = "Hello, world!\n"; 
    int variable = strlen(string); 

    /* Print msg */ 
    printmsg(string, variable); 

    /* Exit */ 
    asm( "movl $1,%eax;" 
     "xorl %ebx,%ebx;" 
     "int $0x80" 
    ); 

} 
+1

Si vous ne prenez pas un cours, et que vous voulez apprendre l'assemblage, puis Je vous recommande sérieusement de ne pas commencer avec l'assemblage en ligne. Cela ajoute des complexités qui peuvent être difficiles à comprendre si vous êtes nouveau. Je vous recommande de créer votre 'printmsg' dans un fichier assembleur séparé, de l'assembler et de le lier à votre programme _C_. –

+0

'printmsg' devrait aussi fonctionner avec quelque chose comme:' void printmsg (char * msg, int len) { __asm__ ("int $ 0x80 \ n \ t" : "a" (4), "b" (1), "c" (msg), "d" (len)); } ' –

+0

Si vous utilisez gcc, asm de base (asm sans paramètres) ne prend PAS en charge la modification du contenu des registres, flags ou memory (ce que vous faites toujours avec' movl $ 4,% eax'). Bien qu'il se compile et puisse (sembler fonctionner), en fonction de ce comportement non pris en charge, il finira par entraîner des échecs difficiles à repérer. Mieux vaut utiliser l'asm étendu, comme Michael propose ci-dessus. –