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 Eigenbau® weiterfahren 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 Eigenbau® weiterfahren 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.


Anmelden zum Antworten