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.