Wie kann man das tun?
Wenn ich analysieren möchte, wie etwas kompiliert wird, wie erhalte ich dann den emittierten Assemblercode?
Wie kann man das tun?
Wenn ich analysieren möchte, wie etwas kompiliert wird, wie erhalte ich dann den emittierten Assemblercode?
Wenn das, was Sie sehen wollen, von der Verknüpfung der Ausgabe abhängt, dann kann objdump auf der Ausgabeobjektdatei/dem ausführbaren Programm zusätzlich zu dem oben erwähnten gcc -S nützlich sein. Hier ist ein sehr nützliches Skript von Loren Merritt, das die standardmäßige objdump-Syntax in die besser lesbare nasm-Syntax umwandelt:
#!/usr/bin/perl -w
$ptr='(BYTE|WORD|DWORD|QWORD|XMMWORD) PTR ';
$reg='(?:[er]?(?:[abcd]x|[sd]i|[sb]p)|[abcd][hl]|r1?[0-589][dwb]?|mm[0-7]|xmm1?[0-9])';
open FH, '-|', '/usr/bin/objdump', '-w', '-M', 'intel', @ARGV or die;
$prev = "";
while(<FH>){
if(/$ptr/o) {
s/$ptr(\[[^\[\]]+\],$reg)/$2/o or
s/($reg,)$ptr(\[[^\[\]]+\])/$1$3/o or
s/$ptr/lc $1/oe;
}
if($prev =~ /\t(repz )?ret / and
$_ =~ /\tnop |\txchg *ax,ax$/) {
# drop this line
} else {
print $prev;
$prev = $_;
}
}
print $prev;
close FH;
Ich vermute, dass dies auch für die Ausgabe von gcc -S verwendet werden kann.
Wie bereits erwähnt, sollten Sie die -S
Option für den GCC. Ich möchte auch hinzufügen, dass die Ergebnisse (stark!) variieren können, je nachdem, ob Sie Optimierungsoptionen hinzufügen oder nicht ( -O0
für keine, -O2
für agressive Optimierung).
Insbesondere auf RISC-Architekturen wird der Compiler den Code bei der Optimierung oft bis zur Unkenntlichkeit verändern. Es ist beeindruckend und faszinierend, sich die Ergebnisse anzusehen!
Wie bereits erwähnt, sehen Sie sich die Flagge -S an.
Es lohnt sich auch, einen Blick auf die Familie der '-fdump-tree'-Flags zu werfen, insbesondere auf '-fdump-tree-all', mit dem Sie einige der Zwischenformen von gcc sehen können. Diese sind oft besser lesbar als Assembler (zumindest für mich) und zeigen Ihnen, wie die Optimierungsläufe ablaufen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.