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çinpushl_
: 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
.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.
Windows toplu bir değişken için bir pr...
Bir program olmadığını kontrol bash bi...
Neden benim program tam olarak 8192 el...
Nasıl görünüm 'görsel diff progra...
Nasıl Python baskı çıktı temizlemesini...