C-Code-Fragmente aus Assembler rekonstruieren



  • Hallo,

    ich hab hier Assemblercode und den dazugehörigen C-Code, in dem Fragmente fehlen. Diese sollten sich ja aus dem Assembler erschließen lassen, aber ich hab da wohl den falschen Ansatz.
    (der Assemblercode wurde mit gcc -S -O3 foo.c erzeugt)

    0:   push   %ebp
    1:   mov    %esp,%ebp
    3:   push   %ebx
    4:   mov    0x8(%ebp),%eax
    7:   mov    0xc(%ebp),%ecx
    a:   lea    (%eax,%eax,4),%eax
    d:   lea    0x4(%ecx,%eax,4),%eax
    11: mov     (%eax),%edx
    13: shl     $0x2,%edx
    16: mov     0xb8(%ecx),%ebx
    1c: add     (%ecx),%ebx
    1e: mov     %ebx,0x4(%edx,%eax,1)
    22: pop     %ebx
    23: mov     %ebp,%esp
    25: pop     %ebp
    26: ret
    
    typedef struct {
            int left;
            a_struct a[LEN];
            int right;
    } b_struct;
    
    void foo(int i, b_struct *bp) {
            int n = bp->left + bp->right;
            a_struct *ap = &bp->a[i];
            ap->x[ap->idx] = n;
    }
    

    Der Wert von LEN und der Aufbau des structs a_struct gilt es herauszufinden.

    Meine Ahname war folgendes, aber das weicht nach der Assemblercodeerzeugung stark von der Vorgabe ab:

    #define LEN 2
    
    typedef struct
    {
      int x;
      int idx[LEN];
    } a_struct;
    

    Wie ist der korrekte C-Code dazu?

    Danke!



  • hi,

    // pseudo-code
             eax = arg1
             ecx = arg2
             eax = ecx+(eax*20)+4       // a_struct *ap = &bp->a[i];       --> sizeof(a_struct) = 20
             edx = [eax]*4              // idx = a.index*4
             ebx = [ecx+180+4]+[ecx]    // int n = bp->left + bp->right;   --> LEN=180
     [edx+eax+4] = ebx                  // ap->x[ap->idx] = n;
    
    //mein Vorschlag:
    typedef struct { 
            int left; 
            a_struct a[9]; 
            int right; 
    } b_struct; 
    
    typedef struct { 
        int idx;     // index in x (0...3)
        int x[4];
    }a_struct;
    


  • Danke, das ist schon näher an der Vorlage:

    push   %ebp
    mov    %esp,%ebp
    mov    0xc(%ebp),%ecx
    mov    0x8(%ebp),%eax
    mov    0xb8(%ecx),%edx
    lea    (%eax,%eax,4),%eax
    add    0x4(%ecx,%eax,4),%eax
    add    (%ecx),%edx
    mov    %edx,0x8(%ecx,%eax,4)
    pop    %ebp
    ret
    

    Inwieweit liefert der gcc bzw. objdump eigentlich unter verschiedenen (Unix-)Systemen vergleichbare oder identische Ergebnisse?



  • In diesem Fall hat das nix mit dem Betriebssystem zu tun. Der erzeugte Code ist nur vom verwendeten Compiler, deren Einstellungen und eventuell von der Version abhängig.


Anmelden zum Antworten