2016-03-25 30 views
0

Satır içi montajdaki konsola basit bir merhaba dünya dizisi yazdırmaya çalışıyorum. Montajım (aşağıda) mükemmel çalışıyor. Bunu mümkün olduğu kadar iyi bir şekilde GAS'a çevirmeyi denedim, ancak değişkenleri genişletilmiş montaj yoluyla değişkenlere kaydetme oldukça zor oldu. Anlatabildiğim kadarıyla, printmsg işlevi aslında hiçbir şey yapmıyor/yazdırmıyor.Yazdır İleti Inline Assembly

Montaj:

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: Michael genişletilmiş montaj örneği kullanarak

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

cevap

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

sonra, bir ders alarak ve montaj öğrenmek isteyen değilseniz Inline derlemeyle _starting_ öğesini ciddi olarak düşünmemenizi tavsiye ederim. Yeni olup olmadığını anlamak zor olabilecek karmaşıklıklar ekler. Printmsg'nizi ayrı bir assembler dosyasında oluşturmanızı, birleştirip _C_ programınıza bağlamanızı tavsiye ederim. –

+0

'printmsg', aşağıdaki gibi bir şeyle çalışmalıdır: void printmsg (char * msg, int uzunluk) { __asm__ (" int $ 0x80 \ n \ t " : :" a "(4)," b "(1), "c" (msg), "d" (len)); } ' –

+0

gcc kullanıyorsanız, temel asm (yani, parametreler olmadan), yazmaçların, bayrakların veya belleğin içeriğini değiştirmeyi desteklemez (bu işlem hala $ 4,% eax' ile yapılıyor). Bu, derlenecek ve çalışacak gibi görünse de, bu desteklenmeyen davranışa bağlı olarak, sonuç olarak, izlenmesi zor olan arızalarla sonuçlanacaktır. Michael'ın yukarıda belirttiği gibi genişletilmiş asm kullanmak daha iyidir. –