Wie übergebe ich Argumente an C ++ - Funktionen, wenn ich sie von der Inline-Assembly aus aufrufe

8

Ich möchte also Funktionen aus einer C ++ DLL aufrufen können. Aus bestimmten Gründen möchte ich sie aus einem __asm-Block in meinem C ++ - Code aufrufen. Meine Frage ist folgende: Ich weiß, dass ich, bevor ich die Funktion aufruft, ihre Argumente auf dem Stack in der Reihenfolge übergeben muss, die durch die Aufrufkonvention der Funktion festgelegt ist. Kann ich jedoch einfach so etwas tun:

%Vor%

Was mich beunruhigt, ist die Tatsache, dass ich mich daran zu erinnern scheint, dass die Standardwortgröße in Assembly 2 Bytes beträgt, während die Größe eines int in C ++ normalerweise 4 Bytes und 8 Bytes für ein Double beträgt. dränge ich wirklich den vollen Wert jeder Variable, oder nur die ersten paar Bytes? Wenn der obige Code nicht korrekt ist, was wäre der richtige Weg? Wenn die Funktion, die wir aufrufen, ein Double zurückgibt, wo wird dieser Wert gespeichert? Ich nehme an, dass es nicht in einem Register sein kann, weil es nur 32bits (4bytes) speichern kann. Jede Hilfe mit diesem Durcheinander würde sehr geschätzt werden:)

    
Emil D 22.02.2010, 18:47
quelle

3 Antworten

13

Um 8-Byte-Werte wie zum Beispiel doppelte Werte zu drücken, können Sie keine reguläre PUSH -Anweisung verwenden. Und Sie schieben auch keine Gleitkommaparameter (oder doubles) auf den Gleitkomma-Stack. Sie müssen diese Fettparameter "von Hand" auf den Stapel legen. Um beispielsweise π als Parameter auf eine Funktion f:

zu schieben %Vor%     
I. J. Kennedy 23.02.2010, 17:42
quelle
4

Die 32-Bit-x86-Architektur puffert automatisch Werte, die auf den Stack geschoben werden, auf 32 Bit.

Es gibt etwas, das Sie beachten müssen. Wenn die Funktion, die Sie anrufen, die Aufrufkonvention __cdecl verwendet, müssen Sie das, was Sie danach gedrückt haben, "auf den Kopf stellen". Für __stdcall-Funktionen müssen Sie dies jedoch nicht tun.

%Vor%     
Deadcode 22.02.2010 18:58
quelle
1

Im Allgemeinen würden Sie die volle Größe des Computerwortes drücken. Dies variiert je nach Chip, aber auf einem 32-Bit-Intel wäre 4 Bytes, und auf einem 64-Bit-Intel wäre 8 (abhängig vom Compiler - Visual Studio unterstützt immer noch nur IA32 Assembly - also 4 Bytes).

Die beste Antwort finden Sie in der Dokumentation für Ihren spezifischen Compiler.

    
Joel 22.02.2010 18:57
quelle