Parameter hinzufügen
-
moin moin,
Angenommen ich habe eine C-Funktion
int Summe(...) { _asm { [asm] mov eax, [ebp+8] add eax, [ebp+12] add eax, [ebp+16][/asm] } }
Diese wurde so aufgerufen:
int main() { Summe( 2, 3, 4 ); return 0; }
Das stelle ich mir in assembler so vor:
push 4 push 3 push 2 call Summe add esp, 12
da in C die Parameter von rechts nach links übergeben werden (cdecl)
Da ich nun nicht weiß, wann der letzte Parameter kommt, möchte ich diesen selbst als "0" hinzufügen. Dies hätte ich oben an Stelle [ebp+20] machen können und dann darauf prüfen können.
Wie kann ich aber die Parameter rückwärts durchgehen, sodass ich die erste Stelle (nach Sicherung dieser) manipulieren kann?Bekomm ich das irgendwie anhand von base- und framestackpointer heraus?
Über hilfe wäre ich sehr dankbar.
-
Du bist gerade dabei, eine eigene Calling Convention zu definieren. Da musst du dann aufpassen, dass dir nicht die standardmässigen Conventions dreinfunken. An deiner Stelle würde ich mich vielleicht mal mit den Internals von
varargs
beschäftigen; schau in den Spezifikationen zu deinem Compiler, wie es dort funktioniert. Falls du mit Marke Eigenbauweiterfahren willst, dann brauchst du eventuell einen eigenen Function Epilogue und Prologue um sowas systematisch zu implementieren. Schau dir
__declspec(naked)
oder ein Äquivalent an...MfG
-
/rant/ schrieb:
Du bist gerade dabei, eine eigene Calling Convention zu definieren. Da musst du dann aufpassen, dass dir nicht die standardmässigen Conventions dreinfunken. An deiner Stelle würde ich mich vielleicht mal mit den Internals von
varargs
beschäftigen; schau in den Spezifikationen zu deinem Compiler, wie es dort funktioniert. Falls du mit Marke Eigenbauweiterfahren willst, dann brauchst du eventuell einen eigenen Function Epilogue und Prologue um sowas systematisch zu implementieren. Schau dir
__declspec(naked)
oder ein Äquivalent an...MfG
Eine andere Methode an das Ende der Parameter zu kommen gibt es also nicht?
-
Doch, du kannst mit EBP theoretisch sehr gut durch eine variable Anzahl Argumente iterieren. Je nach Konvention einfach ein variables Offset addieren und dann dereferenzieren, dann hast du ein Argument. Neue Argumente hinzufügen ist da schon schwieriger, da kommst du um den eigenen Prolog fast nicht rum, ausser du willst das Chaos, dass es mit den lokalen Variablen dann gibt
MfG
PS: mitm handy tippen rult xD
-
/rant/ schrieb:
Doch, du kannst mit EBP theoretisch sehr gut durch eine variable Anzahl Argumente iterieren. Je nach Konvention einfach ein variables Offset addieren und dann dereferenzieren, dann hast du ein Argument.
du meinst im Sinne von
mov eax, [ebp+8] add eax, [ebp+12] add eax, [ebp+16]
Aber dann weiß ich immer noch nicht wieviele Parameter drin stehen.