GCC'86 win 32 boş bir program s montaj çıktı | Netgez.com
SORU
22 AÄžUSTOS 2009, CUMARTESÄ°


GCC'86 win 32 boş bir program s montaj çıktı

Boş programlar oluyor stackoverflow kodlayıcıların DEĞİL sinir etmek için yazıyorum. Sadece gnu araç zinciri keşfetmek duyuyorum.

Şimdi aşağıdaki çok derin benim için olabilir, ama boş bir program destan continuie için C derleyici, malı tüketir GNU çıkışını incelemeye başladım.

gcc version 4.4.0 (TDM-1 mingw32)

test.c:

int main()
{
    return 0;
}

-S gcc test.c

    .file	"test.c"
    .def	___main;	.scl	2;	.type	32;	.endef
    .text
.globl _main
    .def	_main;	.scl	2;	.type	32;	.endef
_main:
    pushl	ëp
    movl	%esp, ëp
    andl	$-16, %esp
    call	___main
    movl	$0, êx
    leave
    ret

Burada ne olduğunu izah EDEBİLİR MİSİN? İşte bunu anlamak için çaba. as manuel ve en az 86 KANAMAYLA bu bilgimi kullandım:

  • .file "test.c" mantıksal dosya adı için Direktif.
  • .def: doktorlara göre"Sembol bir isim için hata ayıklama bilgisi tanımlama baÅŸlamak". Bir sembol (fonksiyon adı/deÄŸiÅŸken mi?) ve ne tür bir bilgi hata ayıklama?
  • .scl: docs söylüyorlarBir sembol statik veya dış olup olmadığını "Depolama sınıfı Mayıs bayrak". Bu aynı ÅŸeystatikvedışC bilirim? Ve bu nedir '2'?
  • .type: maÄŸazalar parametresi< . em ^"türü sembol tablosu giriÅŸi özelliÄŸi olarak"Hiçbir fikrim yok.
  • .endef: sorun yok.
  • .text: Åžimdi bu sorunlu, bir bölümünü aramış gibi görünüyor ve kod için onun yeri okudum ama doktorlar bana çok fazla bir ÅŸey anlatmadı.
  • .globl"sembolü ld görünür kılıyor."manuel bu konuda oldukça açıktır.
  • _main: Bu baÅŸlangıç adresi olabilir (?) benim asıl iÅŸlevi için
  • pushl_: yığın . EBP yerlerde (32 bit) uzunluÄŸunda Bir itme,
  • movl: 32-bit hareket. Pseudo-C: EBP = ESP;
  • andl: Mantıksal VE. Pseudo-C:* *26, gerçekten nedir bu kadar önemli anlamadım.
  • call: yığın IP çaÄŸrılan yordam yolunu bulabilmesi için () Ä°ter ve __main nerede devam ediyor. (ne __ana?)
  • movl: bu sıfır kodumu sonunda döndüğüm sabit olmalıdır. MOV SES içine bu sıfır yerleÅŸtirir.
  • leave: geri talimatı girdikten sonra yığın (?). Neden?
  • ret: yığın . kaydedilen talimat adrese geri gider

Yardımın için teşekkür ederim!

CEVAP
22 AÄžUSTOS 2009, CUMARTESÄ°


.file "test.". c

Komutları ile başlıyor . çevirici için direktifler. Bu sadece bu "dosya olduğunu söyledi."bu bilgiyi exe. hata ayıklama bilgi verilebilir c

.def ___ana; .bgh 2; .yazın 32; .endef

.def direktifleri hata ayıklama sembolü tanımlar. bgh 2 Depolama sınıfı 2(harici depolama sınıfı) anlamına gelir .yazın 32 Bu sumbol bir işlevi olduğunu söylüyor. Bu sayılar pe-coff exe formatlı tarafından belirlenecektir

___ana işlevi gcc ihtiyacı(başlatıcılar ve diğer temizlik c statik gereken çalıştırmak gibi şeyler gelir) önyükleme ilgilenir denir.

.text

Metin bölümü - kod burada hayat başlar.

._main globl

tanımlar _main sembolü olarak bağlantılı olan diğer modülleri için bağlayıcı ve görünür hale getirecek küresel,.

.def        _main;  .scl    2;      .type   32;     .endef

_main oluşturur aynı şeyi simgeler _main bir işlevi olduğunu belirten hata ayıklama. Bu hata tarafından kullanılabilir.

_main:

Başlar yeni bir etiket(Adres düşecek). .globl Direktifi yukarıdaki bu adres başka kişiler için görünür hale getirir.

pushl       ëp

Eski çerçeve kaydeder işaretçi(ebp kayıt) yığın bu fonksiyon sona erdiğinde yerine geri koymak olabilir ()

movl        %esp, ëp

Ebp kayıt işaretçi yığını taşır. ebp denir çerçeve işaretçi, puan üstünde bir yığın değerleri içinde geçerli "Kare"(fonksiyon genellikle), (atıfta değişkenler yığında ile ebp yardımcı olabilir hata)

$-16, %esp ve ben

Bu alınmasını uyumlu olduğu fffffff0 stack ile 16 bayt sınırında eleştiri. Yığında uyumlu değerlere erişim eğer tarafsız olsaydı çok daha hızlı. Tüm bu yukarıdaki talimatları hemen hemen standart bir işlev Prolog.

call        ___main

Aramalar gcc gereken başlatılıyor şeyler yapacak ___ana işlevi. Çağrı ___ana adresine yığını ve atlama geçerli Yönerge işaretçisi itecektir

movl        $0, êx

bu tür hareket 0(karşılığında 0 0;) ses kayıt stdcall çağırma fonksiyonu dönüş değeri saklamak için kullanılan kayıt.

bırakın

Bırakın talimat için oldukça kısaltılmış halidir

movl     ebp,esp
popl     ebp

yani "geri alma" şeyler fonksiyonun başında yapılması - çerçeve işaretçi geri eski durumuna yığını.

ret

Bu işlev adlı kişiye verir. Yığından Yönerge işaretçisi ilgili arama talimatı orada yer alacak olan pop ve oraya sıçrar.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • MaximumPCMag

    MaximumPCMag

    23 Temmuz 2010
  • TheDigiCraft

    TheDigiCraft

    25 NÄ°SAN 2011