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 )


  • Mod

    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.


  • Mod

    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 🙂


Anmelden zum Antworten