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"
);
}
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_. –
'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)); } ' –
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. –