2015-05-05 10 views
5

sayıdır bir argüman sayısı ret bir boşluk işaretçi ve adres fonksiyon adresistdcall asm kayan nokta parametreleri</p> <p>aşağıdaki aksamı args sahip 32bit tam sayılar dizisi argc bir boşluk işaretçisi i (dinamik parametrelerle) dinamik stdcall işlevlerini çağıran uygulamaya çalışırken Ge satır içi montaj im kullanarak

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; 

nasıl yüzen nokta argümanları geçirilir mi?

+1

Yığında, diğer her şey gibi. Not: işaretçiyi 'EAX' içine yüklemeniz gerekmez, 'dword ptr [Adres]' diyebilirsiniz. Ayrıca, "push" işlevini kullanırsanız, argüman sırasını ters çevirmeniz gerektiğini unutmayın. – Jester

+0

Arama kuralı genellikle dil, mimari ve işletim sistemine bağlıdır. X86 üzerinde kayan nokta değerleri kayan nokta yığınının üzerine itilir. – qznc

+2

@qznc, nope bile yakın değil. – Johan

cevap

2

Microsoft bu konuda çok sessizdir.
Bunun nedeni, stdcall yalnızca WinAPI aramaları için kullanılır.
Ve bildiğim bir WinAPI çağrısı, kayan nokta parametrelerini kabul etmiyor.

Accordingall için documentation Tüm parametrelerin yığının üzerine itildiğini bulabilirim.
Bu, kayan nokta parametrelerini içerir. Benim derleyici aşağıdaki pasajı derlemek

Bunu da teyit: bir kayan noktalı dönüş değeri ST(0) döndürülen alır

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 

Not söyledi.

İlgili konular