2016-03-25 7 views
0

Ich versuche, eine einfache Hallo Welt Zeichenfolge auf der Konsole in Inline-Montage zu drucken. Meine Montage (unten) funktioniert einwandfrei. Ich habe versucht, es so gut wie möglich in GAS zu übersetzen, aber es erwies sich als schwierig, die Variablen in die Register einzutragen. Von dem, was ich sagen kann, tut die printmsg Funktion nicht wirklich nichts.Print Message Inline Assembly

Montage:

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" 
    ); 
} 

Antwort

0

Michaels erweiterten Montagebeispiel Verwendung:

#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

Wenn Sie keinen Kurs und wollen nehmen Montage lernen, dann Ich empfehle Ihnen ernsthaft, nicht mit der Inline-Montage zu beginnen. Es fügt Komplexitäten hinzu, die möglicherweise schwierig zu verstehen sind, wenn Sie neu sind. Ich würde empfehlen, Ihr 'printmsg' in einer separaten Assembler-Datei zu erstellen, zu assemblieren und mit Ihrem _C_-Programm zu verknüpfen. –

+0

'printmsg' sollte auch mit etwas funktionieren wie:' void printmsg (char * msg, int len) { __asm__ ("int $ 0x80 \ n \ t" : : "a" (4), "b" (1), "c" (msg), "d" (len)); } ' –

+0

Wenn Sie gcc verwenden, unterstützt basic asm (dh asm ohne Parameter) NICHT das Ändern des Inhalts von Registern, Flags oder Speicher (was Sie immer noch mit' movl $ 4,% eax' machen). Während es kompiliert wird und funktionieren kann (scheint), führt das abhängig von diesem nicht unterstützten Verhalten schließlich zu schwer zu verfolgenden Fehlern. Es ist besser, Extended Asm zu verwenden, wie Michael oben vorgeschlagen hat. –

Verwandte Themen