Frage

Also, ich würde gerne in der Lage sein, aufrufen von Funktionen aus einer c++ - dll.Aus bestimmten Gründen möchte ich Sie nennen, aus einer __asm block in meinem C++ - code.Meine Frage ist:Ich weiß, dass, bevor ich die Funktion aufrufen, habe ich zu schieben, die seine Argumente auf dem Stapel in der angegebenen Reihenfolge von der Funktion calling convention.Jedoch kann ich einfach so etwas tun:

int a=5;   
double b = 5.0;  
__asm{  
       push b 
       push a  
       call functionAddress  
}

Was mich beunruhigt, ist die Tatsache, dass ich glaube mich zu erinnern, dass die standard-word-Größe in der Montage ist, 2bytes, während die Größe eines int in C++ ist in der Regel 4bytes und 8 bytes für double.Also , im obigen Beispiel bin ich wirklich drücken Sie den vollen Wert der einzelnen Variablen, oder nur die ersten paar bytes?Wenn der obige code nicht richtig ist, was der richtige Weg wäre, es zu tun?Auch wenn die Funktion, die wir aufrufen, gibt ein double zurück, wo dieser Wert gespeichert?Ich nehme an, es kann nicht in einem register, denn es kann nur Shop 32bits ( 4bytes ).Jede Hilfe mit diesem Chaos würde sehr geschätzt werden :)

War es hilfreich?

Lösung

Push-8-byte-Werte wie die Doppelzimmer, Sie werden nicht in der Lage zu bedienen eine regelmäßige PUSH Anleitung.Und auch nicht, wie Sie push-floating-point-Parameter (oder Doppel) auf das floating-point-stack.Setzen Sie diesen Fetten Parameter auf dem Stapel "von hand".Für Beispiel, drücken π als parameter an eine Funktion f:

  __asm {
    FLDPI                    // load pi onto FP stack
    SUB ESP,8                // make room for double on processor stack
    FSTP QWORD PTR [ESP]     // store pi in proc stack slot (and pop from FP stack)
    CALL f
    ADD ESP,8                // clean up stack (assuming f is _cdecl)
  }

Andere Tipps

Die 32-bit-x86-Architektur automatisch pads Werte werden auf den Stapel verschoben auf 32 bit.

Es ist etwas, müssen Sie im Auge zu behalten.Wenn die Funktion, die Sie aufrufen, verwendet der __cdecl-Aufrufkonvention, müssen Sie "pop", was Sie geschoben danach.Jedoch, für __stdcall-Funktionen müssen Sie das nicht tun.

extern "C" int    __cdecl   function1(int, double);
extern "C" double __stdcall function2(char, char*);

int a = 5;
double b = 5.0;
int retval1;
char c = '5';
char *d = "Hello";
double retval2;

__asm {
    push b
    push a
    call function1
    add esp, 4*2 // "pop" what we pushed
    mov retval1, eax
    push d
    push c
    call function2
    mov retval2, eax
}

In der Regel, Sie würde darauf drängen, die volle Größe der computer-Wort.Diese variiert je nach chip, sondern auf einem 32-bit-Intel-wäre 4bytes, und auf einem 64-bit-Intel -, wäre 8 (je nach compiler-Visual Studio weiterhin unterstützt nur IA32-Montage -- also 4 bytes).

Die beste Antwort ist der Blick auf die Dokumentation für Ihre spezielle compiler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top