Quote:
Originally Posted by mydoom
<ot>Poste bitte noch weitere Beispiele. Es macht Spaß diese Unterwegs zu "lösen" ;D </ot>
Aber ich hätte selbst noch eine Frage dazu:
ARG.2 ist EBP+12, weil vor dem Basepointer (EBP+4) noch die Rücksprungadresse liegt und deshalb EBP+8 das erste Argument bzw EBP+12 das Zweite Argument ist oder?
|
jop, ist richtig
Quote:
Originally Posted by SmackJew
Falsch, ohne dword ptr ist das Verhalten nicht definiert.
|
weiß ich doch, bin schreibfaul und hierfür hats gereicht ;>
Quote:
Originally Posted by ¿Freaky¿
Ich bin jetzt voll am verzweifel ^^
Ok weiß jetzt wie ihr auf ebp gekommen seid.
Aber woher kommt +12 und -4 ?
Code:
00414B44 . 8B4D 0C MOV ECX,DWORD PTRSS:[ebp+12]
00414B47 . 8D45 FC LEA EAX,[ebp-4]
|
das ist das offset vom pointer :rolleyes:
sind ja nicht alle parameter an der selben stelle.
ob ebp oder esp entscheidet die calling convention und je nachdem, wird + oder - genommen (bei cdecl immer + und bei stdcall kommts drauf an)
__stdcall:
funktion beginnt damit, den base pointer zu sichern und dann den stack poiter reinzukopieren, damit man auf parameter und lokale variablen zugreifen kann, ohne calls und push'es mitten in der funktion beachten zu müssen:
Code:
push ebp
mov ebp, esp
sub esp, 4 //platz für eine lokale variable und diese ist nun bei esp oder ebp-4
mov eax, [epb+8] // epb zeigt auf den alten ebp wert, ebp+4 auf die return adresse und ebp+8 auf den ersten parameter
mov ebx, [ebp-4] //oder eben [esp]
das könnte auch so ersetzt werden:
Code:
push ebp
mov ebp, esp
sub esp, 4
mov eax, [ARG1]
mov ebx, [LOCAL1]
bei einer __cdecl funktion würde für alles esp genutzt:
Code:
sub esp, 4
mov eax, [esp+8] //erster parameter (da esp durch das sub esp verringert wurde)
mov ebx, [esp] //local 1
// und wenn jetzt ein push kommt, greift man direkt anders zu(nervig, wenn man sowas reversed)
push eax
mov eax, [esp+C] //erster parameter
mov ebx, [esp+4] //local 1
hoffe, nun ists verständlich.
und ja, vor die klammern kommt eine ptr größe.
es muss nicht dword ptr sein, es geht auch ein word, lieber Jude aus Brasilien ;O
also denkt euch dword ptr davor und dann passts