Ein einfaches Beispiel



  • void Funktion(int* n)
    {
      int i;
      n=n*i;
    }
    

    Wie würde der obige Code in Assembler aussehen? Ich brauche das um einen Einstieg zu finden. Danke 🙂



  • a) meinst du nicht eher *n = *n * i? Ich übersetze es mal so, sonst wird das ganze nämlich ziemlich unsinnvoll, den Pointer zu muliplizieren (genauer: garnicht kompilierbar).

    b) Meine Interpretation:

    _Funktion:
       ; prolog
       push ebp
       mov ebp, esp
       ; platz aufm Stack für lokale Variable i
       sub esp, 4
       ; Parameter holen
       mov esi, [ebp+8]
       ; pointer auflösen
       mov eax, [esi]
       ; multiplizieren
       imul eax, [ebp-4]
       ; ergebnis speichern
       mov [esi], eax
       ; epilog
       leave
       ret
    

    c) Interpretation des gcc (man muss ja Varianten haben ;))

    _Funktion:
            push    ebp
            mov     ebp, esp
            sub     esp, 4
            mov     edx, DWORD PTR [ebp+8]
            mov     eax, DWORD PTR [ebp+8]
            mov     eax, DWORD PTR [eax]
            imul    eax, DWORD PTR [ebp-4]
            mov     DWORD PTR [edx], eax
            leave
            ret
    


  • @TriPhoenix: Ich hätte da mal ne Frage zur LEAVE Instruktion. Ich dachte die benutzt man nur in Kombination mit ENTER. Woher weiß die Instruktion wie sie den Stack wieder aufzuräumen hat?



  • Original erstellt von malfunction:
    @TriPhoenix: Ich hätte da mal ne Frage zur LEAVE Instruktion. Ich dachte die benutzt man nur in Kombination mit ENTER. Woher weiß die Instruktion wie sie den Stack wieder aufzuräumen hat?

    LEAVE ist das Äquivalent zu
    mov esp, ebp
    pop ebp

    egal, was enter da anstellt ist das immer die richtieg Methode, da zwischendurch belegter Speicher aufm Stack einfach über mov esp, ebp wieder aufgeräumt wird. Außerdem ist LEAVE schneller als die zweier-Kombi und kürzer zu schrieben. Deswegen, warum nicht 🙂



  • Vielen Dank. Dann werde ich das wahrscheinlich auch in Zukunft benutzen. 😉



  • Außerdem ist LEAVE schneller als die zweier-Kombi und kürzer zu schrieben.

    schneller in der Ausführung oder schneller zu schreiben? oder beides? 😮 😮



  • Original erstellt von <furz>:
    schneller in der Ausführung oder schneller zu schreiben? oder beides? 😮 😮

    Beides. Der Prozessor spart sich ein Instruction Fetch und außerdem eine Dekodierung. Das demonstriert sich ganz shcön indem man betrachtet wie beides Kodiert wird:

    LEAVE: C9
    2er-Kombi: 89 EC 5D


Anmelden zum Antworten