Effektive adresse berechnen



  • Problem: man möchte die Adresse (auf dem Stack) einer Variablen an ein unterprogramm übergeben.

    sagen wir die liegt bei

    ebp - 8
    

    warum geht nicht:

    mov eax, ebp-8
    

    und stattdessen:

    lea eax, [ebp-8]
    

    in ebp-8 steht doch die adresse der variablen auf dem stack...wieso kann ich die nicht einfach in eax kopieren und muss lea benutzen?



  • sorry, wollte im assembler forum posten, könnte das jemand verschieben?
    danke



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum Assembler verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • mov eax, ebp-8
    

    das nimmt den inhalt des ebp-registers, zieht 8 ab und das ergebnis landet in eax.

    lea eax, [ebp-8]
    

    das nimmt den inhalt des ebp-registes, zieht 8 ab und interpretiert das ergebnis als adresse. der 32-bit wert an dieser adresse wird nach eax kopiert.

    kann sein, dass meine beschreibung etwas falsch ist, ich kenne mich mit x86-asm nicht so gut aus.
    🙂



  • mmp1 schrieb:

    mov eax, ebp-8
    

    und stattdessen:

    lea eax, [ebp-8]
    

    weil mov nicht rechnen kann. ebp-8 muesste erstmal ausgerechnet werden

    mov eax,[ebp-8]
    

    wiederrum weist mov nur drauf hin von dieser adresse lesen zu lassen und das ergebnis in eax abzulegen.

    lea schlussendlich rechnet wirklich.



  • mmp1 schrieb:

    mov eax, ebp-8
    

    Das geht nicht, weil es in Assembler keine Ausdrücke wie 'ebp-8' gibt. Du kannst ja auch nicht sowas wie mov eax, 3*4+ecx-edx/2 schreiben, sondern musst das schön in eine Sequenz von einzelnen MUL, ADD usw. aufdröseln.

    lea eax, [ebp-8]
    

    LEA ist eine Besonderheit: Hier wird die Möglichkeit des Prozessors, Adressen zu bilden (für indirekte Adressierung) zum Rechnen "mißbraucht". Das Ergebnis wird halt nicht als Adresse verwendet, sondern in ein Register umgebogen. Das kann man aber nicht verallgemeinern.



  • rapso schrieb:

    mmp1 schrieb:

    lea eax, [ebp-8]
    

    weil mov nicht rechnen kann. ebp-8 muesste erstmal ausgerechnet werden

    das hat mir sehr weitergeholfen, wusste nicht, dass mov nicht rechnen kann!

    also kann ich mit lea rechnen?

    z.b.

    lea eax, 4*ebx
                lea ecx, 5*ebx
                lea edx, 6*ebx
    

    etc?



  • Nur soweit die Adressbildung das auch kann. Ich weiß nicht, was aktuelle Prozessoren können, aber früher konnte man dort nur mit Zweierpotenzen multiplizieren und auch nur bestimmte Register addieren.



  • Ich hab das kurz in Ollydebug getestet:

    EAX hält den Wert 0.

    0040F5B2 >  8D43 01         LEA EAX,DWORD PTR DS:[EBX+1]             ; before: all registers are set to 0, afterwards: eax holds 1
    0040F5B5    8D0485 00000000 LEA EAX,DWORD PTR DS:[EAX*4]             ; afterwards: eax holds 4
    0040F5BC    8D40 FE         LEA EAX,DWORD PTR DS:[EAX-2]             ; afterwards: eax holds 2
    

    Aber irgendwie geht dividieren nicht, weil weder ':' noch '/' erlaubt ist. Kennt jemand ein Workaround oder die Lösung dazu? Danke.

    Gruss, TBOT



  • Aber irgendwie geht dividieren nicht

    Wie bereits gesagt wurde, ist der Befehl "LEA" zur Adressbildung (zb: offset + index*operandengroesse) gedacht!
    Es sollte schnell ersichtlich werden dass hier die zusaetzliche Integration einer Divisionsheit ueber das Ziel hinaus schiessen wuerden.


Anmelden zum Antworten