Bir C ++ programının derleme kodunu nasıl görebilirim?


Yanıtlar:


167

Derleyiciye sorun

Programı kendiniz oluşturuyorsanız, derleyicinizden assembly kaynağı vermesini isteyebilirsiniz. Çoğu UNIX derleyicisi için -Sanahtarı kullanın .

  • GNU assembler'ı kullanıyorsanız, ile derleme, -g -Wa,-alhstdout'ta birbirine karıştırılmış kaynak ve montaj sağlar ( -Waderleyici sürücüsünden seçenekleri assembler'a iletmesini ister -al, montaj listesini açar ve -ah"yüksek seviyeli kaynak" listesini ekler):

    g++ -g -c -Wa,-alh foo.cc

  • Visual Studio için kullanın /FAsc.

İkiliye göz atın

İkili derlediyseniz,

Hata ayıklayıcınızı kullanın

Hata ayıklayıcılar aynı zamanda yıkıcı bir şekilde de gösterebilir.

  • disasGDB'de komut kullanın ,
  • veya Windows'ta Visual Studio'nun sökme penceresi .

35

GCC / G ++ 'da -S,. Bu something.s, montaj kodunu içeren bir dosya çıkaracaktır .

Düzenleme: Çıktının Intel sözdiziminde olmasını istiyorsanız (ki bu IMO'dur, çok daha okunabilirdir ve çoğu derleme öğreticisi onu kullanır), ile derleyin -masm=intel.


5
ayrıca -fverbose-asmseçenek ekle
osgx

23

Visual Studio'da ;

  1. kesme noktası ayarla
  2. programı kesme noktasında durana kadar çalıştırın
  3. kaynak kodunu sağ tıklayın ve "demontajı göster" i seçin

14

Gcc / g ++ için

gcc -save-temps -fverbose-asm prog.c

Bu, her asm satırında kullanılan değişkenler hakkında bazı yorumlar içeren prog.s oluşturacaktır:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #


6

Bir çok insan belirli bir derleyici ile montaj kodunu nasıl yayınlayacağını zaten anlattı. Diğer bir çözüm ise bir nesne dosyasını derlemek ve objdump , readelf (Unix üzerinde) veya DUMPBIN ( link ) (Windows'ta) . Ayrıca bir yürütülebilir dosyanın dökümünü de atabilirsiniz, ancak çıktıyı okumak daha zor olacaktır.

Bu, herhangi bir derleyici ile aynı şekilde çalışma avantajına sahiptir.


6

Kullandığınız hata ayıklayıcının bir derleme görünümüne (Visual Studio, Borland IDE, gdb, vb.) Sahip olması gerekir. Bir hata ayıklayıcı kullanmıyorsanız ve yalnızca bir programda hangi derlemenin olduğunu görmek istiyorsanız, bir dağıtıcı kullanabilir veya alternatif olarak programı çalıştırabilir ve bir hata ayıklayıcı ile ona ekleyebilir ve döküm işlemini buradan yapabilirsiniz. Seçenekler hakkında bilgi için sökücü referanslarına bakın .


5

Başka birinin bahsettiği gibi, platformunuzun hata ayıklayıcısı iyi bir başlangıç ​​noktasıdır. Tüm hata ayıklayıcıların ve parçalayıcıların matkap için IDA Pro'ya bir göz atın .

Unix / Linux platformlarında (Cygwin dahil) kullanabilirsiniz objdump --disassemble <executable>.


Derleyicinin assembler'ı oluşturması için bir seçenek varsa (gcc -S veya aşağıdaki VS / FA seçeneği gibi), bu demontaj yerine tercih edilir. Daha sembolik.
Marco van de Voort

Tabii, eğer kaynağa sahipseniz.
Ori Pessach

2
Bu arada, IDA Pro tarafından ne kadar sembol bilgisinin çıkarılabileceğine şaşıracaksınız.
Ori Pessach

5

Çoğu derleyicinin bir derleme listesi çıktısı alma seçeneği vardır. Örneğin, VisualStudio ile aşağıdaki gibi bir şey kullanabilirsiniz:

cl.exe /FAfile.asm file.c

Yine de en iyi okunabilirlik için, çoğu hata ayıklayıcı, sökme işlemini orijinal kaynakla harmanlayan bir görünüm sunacaktır, böylece kodunuzu derleyicinin çıktısıyla satır satır karşılaştırabilirsiniz.



3

Bu siteyi de deneyebilirsiniz: http://assembly.ynh.io/

Orada, C veya C ++ kodunuzu yapıştırabilir ve montaj eşdeğer sürümünü görmek için mavi bir düğmeye basabilirsiniz.


Bilginize, yüklenemiyor
kaiwan

Evet, 2015'te iyi çalışıyordu, sonra aniden durdu. Sonra ctoassembly.com geldi, ancak yalnızca küçük bir C alt kümesi için çalıştı. Aynı şey oldu: artık yüklenmiyor. Çok kötü.
Gomes JA

2

Visual Studio'da bir C ++ projesi için derleyici listesini oluşturabilirsiniz.

Proje özelliklerine gidin, ardından C ++ / Output Files'a gidin ve Assembler Output ayarını ve ASM liste konumunu bir dosya adına ayarlayın.


1

Intel Mac OS X 10.8 (Mountain Lion) üzerinde -masm=intelyönerge çalışmadı. Ancak, Xcode yüklediyseniz, 'otool' adlı aracı yüklemiş olmanız gerekir :

otool code.o -tV

Derlenmiş nesne kodunu bir parametre olarak sağlamalısınız.


0

Eclipse kullanıcısıysanız, Demontaj görünümünü kullanabilirsiniz .

Demontaj görünümü, yüklenen programı, karşılaştırma için kaynak koduyla karıştırılmış montajcı talimatları olarak gösterir. Halihazırda yürütülmekte olan çizgi bir ok işaretiyle belirtilir ve görünümde vurgulanır. Sökme görünümünde aşağıdaki görevleri yapabilirsiniz:

  • Herhangi bir assembler talimatının başlangıcında kesme noktaları ayarlayın
  • Kesme noktalarını etkinleştirin ve devre dışı bırakın ve özelliklerini ayarlayın
  • Programınızın sökme talimatlarında ilerleyin
  • Programdaki belirli talimatlara geçin

Biraz detaylandırır mısınız?
Peter Mortensen

Ayrıca
MSVC'de

Şu anda çalışan bir Eclipse C ++ geliştirme ortamım
Pieter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.