2011-08-25 15 views
48

Bazı asm kodlarıyla oynuyorum ve bir şey beni rahatsız ediyor.GCC tarafından oluşturulan asmı nasıl derlerim?

bu derleme: gcc file.c -S -o file.S ile

#include <stdio.h> 

int main(int argc, char** argv){ 
    printf("Hello World\n"); 
    return 0; 
} 

bu asm kod güzel küçük bir parçasını oluşturur:

.cstring 
LC0: 
    .ascii "Hello World\0" 
    .text 
.globl _main 
_main: 
LFB3: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    subq $16, %rsp 
LCFI2: 
    movl %edi, -4(%rbp) 
    movq %rsi, -16(%rbp) 
    leaq LC0(%rip), %rdi 
    call _puts 
    movl $0, %eax 
    leave 
    ret 
LFE3: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 
EH_frame1: 
    .set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 
LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x1 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 
.globl _main.eh 
_main.eh: 
LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 
LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB3-. 
    .set L$set$2,LFE3-LFB3 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB3 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .subsections_via_symbols 

Bir sonraki sorun gerçekten, bu çıktıyı derlemek nasıl olduğunu ve can GCC'yi benim için yapar mı?

cevap

61

Evet, Asm kodunuzu derlemek için gcc'yi kullanabilirsiniz. Bu şekilde derleme için -c kullanın:

Bu, dosya.o adlı nesne kodu dosyasını verecektir. bağlayıcı yukarıdaki komutu sonra aşağıdaki gerçekleştirmek çağırmak için:

gcc file.o -o file 
+9

Ayrıca sadece gcc dosyası kullanabilirsiniz. -o dosya ' –

+0

ne hakkında"> as -o merhaba.o merhaba "? https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html adresinde belirtildiği gibi. Süreç sırasına göre ön işlem (* .i dosyası), derleme (*. S-file), derleme (*. O-file) ve bağlantı (* .exe dosyası) gibi görünüyor. – user1677716

3

Evet, gcc, derleme kaynak kodunu derleyebilir. Alternatif olarak, assembler olan as'u da çağırabilirsiniz. (Gcc .. C derleyicisi, C++ derleyicisi, montajcı, bağlayıcı çağırmak için buluşsal yöntemlerini kullanır sadece bir "sürücü" programı, vs olduğu)

+1

GCC bazı binutils öğrenmesine yardımcı olacak? –

+0

Ayrıca, Intels icc yalancı var, hangi assembler kullanıyorlar? –

+4

@Martin, 'gcc -v' eylemlerini anlatmasını isteyin. –

7

Normal bir C programında montaj kodu yerleştirebilirsiniz. İşte iyi bir introduction.

  • eax foo olacaktır
  • ebx çubuğu
  • değer olacaktır: Uygun sözdizimi kullanarak, aynı zamanda programın altına o gcc talimat C de bildirilen değişkenler ile etkileşim isteyen GCC söyleyebilir montaj kodu

\ n

int main(void) 
{ 
     int foo = 10, bar = 15; 
     __asm__ __volatile__("addl %%ebx,%%eax" 
          :"=a"(foo) 
          :"a"(foo), "b"(bar) 
          ); 
     printf("foo+bar=%d\n", foo); 
     return 0; 
} 
37

yürütülen sonra eax foo depolanmalıdır, bir montaj dosyasını girdi olarak kullanabilir ve gerekli olduğunda assembler'ı çağırır. Dosya adı ".s" (küçük harf 's'), sonra gcc montajcı çağırır ile sona ererse

  • : gerçi bir incelik vardır.
  • dosya adı ile sona ererse
  • " .S" (büyük harf 'S'), sonra gcc kaynak dosyada C önişlemci uygular (yani o #if gibi direktiflerini tanır ve makro yerine geçer) ve sonra üzerine assembler çağırır sonuç.

Yani, genel olarak, bu gibi şeyler yapmak istiyorum:

gcc -S file.c -o file.s 
gcc -c file.s 
+0

Çalışması gibi görünüyor ama bir hata mesajı alıyorum: 'Hatalı bir Mach-o dosyası' –

+0

Sanırım '.S' önekini (büyük harf) kullanmanız gerekir, aksi halde gcc başka bir dosya türünü algılar (örneğin .asm ile başarısız olur)) –

0
nasm -f bin -o 2_hello 2_hello.asm 
+2

Bu kısa bir cevap. Biraz açıklama ekleyebilir misiniz lütfen? Belki de bize parametrelerin ne yaptığını ve diğer cevaplarla karşılaştırıldığında ne yaptığınızı söyleyebilirsiniz. – GameDroids

İlgili konular