C-Programm Analysieren
-
Hallo Community,
für die Uni soll ich ein Programm compilieren, dann assemblieren und analysieren.
#include <stdio.h> int main(void) { int n = 40; int res; if(n==40) { res = n * 2; } printf("result= %d", res) return 0; }
Die Fragestellungen sind
Analysieren Sie den vom GCC Compiler generierten Code. Das Programm soll mit gcc test.c (also ohne Optio-
nen) übersetzt werden. Disassemblieren Sie den vom GCC erzeugten Code (objdump S ./a.out)- Geben Sie das
Programmfragment in Assembler an, welches den Ausdruck res = n * 2; berechnet.Leider kann ich keinen Anhaltspunkt finden. Ein mul(i) wird nicht genutzt wie in Assembler üblich zum multiplizieren. Kann mir jemand einen Tipp geben oder das ganze etwas eingrenzen, wonach ich suchen muss. Das soll kein Aufruf sein die Aufgabe für mich zu lösen sondern mir beim Verständnis des Programms in Dessemblierter Form helfen.
( Hier der Deassemblierte code den ich bekomme: http://pastebin.com/CSFaUQxZ )
-
Heißer Tipp:
2*n = n+n
-
Ahoi !
SeppJ hat dir im Prinzip schon die Lösung gesagt.^^
Ich hab das Disassembly mal etwas kommentiert:
0000000000400494 <main>: 400494: 55 push %rbp 400495: 48 89 e5 mov %rsp,%rbp 400498: c7 45 f8 28 00 00 00 movl $0x28,-0x8(%rbp) ; 0x28 = 40 Dezimal rbp-0x8 = 0x28 40049f: 8b 45 f8 mov -0x8(%rbp),%eax ; eax = 0x28 4004a2: 01 c0 add %eax,%eax ; eax= 0x28 0x28+0x28 = 0x50 = 80 Dezimal 4004a4: 89 45 fc mov %eax,-0x4(%rbp) 4004a7: b8 00 00 00 00 mov $0x0,%eax 4004ac: c9 leaveq 4004ad: c3 retq 4004ae: 90 nop 4004af: 90 nop
-
Eine Multiplikation mit 2 wird in Assembler am schnellsten mit einem Linksshift um 1 Stelle
gemacht:mov eax,40 shl eax,1
Fertig. Danach würde ich suchen.
-
gigg schrieb:
Eine Multiplikation mit 2 wird in Assembler am schnellsten mit einem Linksshift um 1 Stelle
gemacht:Dann solltest du dich unbedingt mal im GCC-Projekt einklinken, da deren Compiler selbst auf höchste Optimierungsstufe noch addl erzeugt. Die wissen das anscheinend nicht besser und könnten solche Profitipps gebrauchen.
-
SeppJ schrieb:
gigg schrieb:
Eine Multiplikation mit 2 wird in Assembler am schnellsten mit einem Linksshift um 1 Stelle
gemacht:Dann solltest du dich unbedingt mal im GCC-Projekt einklinken, da deren Compiler selbst auf höchste Optimierungsstufe noch addl erzeugt. Die wissen das anscheinend nicht besser und könnten solche Profitipps gebrauchen.
Das ist eine gute Idee, aber ich glaube, die wollen mich nicht.
-
Danke für die fleißigen Antworten,
die haben sehr geholfen. Ich habe schon nach allem möglichen gesucht aber auf diese Idee wäre ich nicht gekommen.Die nächste Aufgabe versuche ich jetzt erstmal selbst, wenn es garnicht mehr hilft hol ich mir wieder Brainstorming