2015-05-05 14 views
5

utilizzando D assembly inline im cercando di attuare chiamano funzioni STDCALL dinamicamente (con parametri dinamici)stdcall ASM

Ho il seguente complesso args è un puntatore nullo a un array di interi a 32 bit argc è il numero della è il conteggio ret argomento è un puntatore nullo e indirizzo è l'indirizzo della funzione

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; 

argomenti virgola come sono galleggianti passava?

+1

In pila, come tutto il resto. PS: non hai bisogno di caricare il puntatore in 'EAX', puoi fare' call dword ptr [Address] '. Si noti inoltre che se si utilizza 'push' è necessario invertire l'ordine degli argomenti. – Jester

+0

La convenzione di chiamata di solito dipende dalla lingua, dall'architettura e dal sistema operativo. Sui valori xxx in virgola mobile vengono inseriti nello stack in virgola mobile. – qznc

+2

@qznc, nope nemmeno vicino. – Johan

risposta

2

Microsoft è molto silenzioso su questo problema.
Questo perché stdcall viene utilizzato solo per le chiamate WinAPI.
E nessuna chiamata WinAPI che io conosca accetta parametri in virgola mobile.

According a all il documentation Sono in grado di trovare tutti i parametri vengono inseriti nello stack.
Questo include i parametri in virgola mobile.

Se compilo il seguente frammento nel mio compilatore si conferma:

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 

Si noti che un valore di punto di ritorno che galleggia viene restituito in ST(0).