2015-05-05 6 views
5

D inline Montag im mit versuchen stdcall Funktionen dynamisch zu implementieren Aufruf (mit dynamischen Parametern)stdcall asm Gleitkomma-Parameter

habe ich folgendes Baugruppe args ist ein Hohlraum Zeiger auf ein Feld von 32-Bit-Integer argc ist die Anzahl of ist das Argument count ret ist ein ungültiger Zeiger und Adresse ist die Funktion Adresse

MOV EBX, 0; 
iterator: 
MOV EAX, DWORD PTR [args]; 
PUSH EAX; 
ADD EBX, 1; 
ADD EAX, 4; 
CMP EBX, DWORD PTR argc; 
JNE iterator; 
MOV EAX, ADDress; 
CALL EAX; 
MOV [ret], EAX; 
RET 0; 

Wie werden Gleitkomma Argumente übergeben?

+1

Auf dem Stapel, als alles andere. PS: Sie müssen den Zeiger nicht in 'EAX' laden, Sie können' dword ptr [Address] 'aufrufen. Beachten Sie auch, dass Sie die Argumentreihenfolge umkehren müssen, wenn Sie 'push' verwenden. – Jester

+0

Die Aufrufkonvention hängt normalerweise von Sprache, Architektur und Betriebssystem ab. Auf x86 werden Fließkommawerte auf den Gleitkomma-Stack geschoben. – qznc

+2

@qznc, nein, nicht einmal in der Nähe. – Johan

Antwort

2

Microsoft ist zu diesem Problem sehr leise.
Dies ist, weil stdcall nur für WinAPI-Aufrufe verwendet wird.
Und kein WinAPI-Aufruf, den ich kenne, akzeptiert Gleitkommaparameter.

According bis all die documentation Ich kann alle Parameter finden, die auf den Stapel geschoben werden.
Dies beinhaltet Gleitkommaparameter.

Wenn ich den folgenden Code-Schnipsel in meinem Compiler kompiliert bestätigt es dies:

void __stdcall test3(double a, double b, double c) { 
};  
..... 
test3(a,b,c); 
..... 
//This produces the following code as per the stdcall convention. 
004182B4 55    push ebp 
004182B5 8BEC    mov ebp,esp 
004182B7 83C4E8   add esp,-$18 
004182BA FF75EC   push dword ptr [ebp-$14] 
004182BD FF75E8   push dword ptr [ebp-$18] 
004182C0 FF75F4   push dword ptr [ebp-$0c] 
004182C3 FF75F0   push dword ptr [ebp-$10] 
004182C6 FF75FC   push dword ptr [ebp-$04] 
004182C9 FF75F8   push dword ptr [ebp-$08] 
004182CC E8ABFFFFFF  call Test3 

Beachten Sie, dass eine Gleitkomma-Rückgabewert in ST(0) zurückgegeben wird.