2016-03-25 3 views
0

Я пытаюсь напечатать простую милую строку hello на консоли в встроенной сборке. Моя сборка (внизу) отлично работает. Я попытался перевести его в ГАЗ как можно лучше, но перенос переменных в регистры через расширенную сборку оказался довольно сложным. Из того, что я могу сказать, функция printmsg фактически не выполняет/не печатает ничего.Распечатать сообщение Inline Assembly

Монтаж:

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

ответ

0

Использование расширенного пример сборки Майкла:

#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

Если вы не принимаете курс, и хотите узнать сборку, то Я рекомендую вам серьезно подумать об отсутствии _starting_ с встроенной сборкой. Это добавляет сложности, которые могут быть трудно понять, если вы новичок. Я бы рекомендовал создать ваш 'printmsg' в отдельном файле ассемблера, собрать его и связать с программой _C_. –

+0

'printmsg' также должен работать с чем-то вроде:' void printmsg (char * msg, int len) { __asm__ ("int $ 0x80 \ n \ t" : : "a" (4), "b" (1), «c» (msg), «d» (len)); } ' –

+0

Если вы используете gcc, базовый asm (т. Е. Asm без параметров) НЕ поддерживает изменение содержимого регистров, флагов или памяти (которые вы все еще делаете с помощью movl $ 4,% eax'). В то время как он будет компилироваться и может (как представляется) работать, в зависимости от этого неподдерживаемого поведения в конечном итоге приведет к сбоям, затрудняющим отслеживание. Лучше использовать расширенный asm, как предлагает Майкл выше. –