2015-05-05 17 views
5

sử dụng im D inline lắp ráp cố gắng để thực hiện chức năng gọi stdcall động (với các thông số động)stdcall asm thông số dấu chấm động

tôi có lắp ráp sau args là một khoảng trống con trỏ đến một mảng các số nguyên 32bit argc là số của số đếm đối số là một con trỏ và địa chỉ hàm là địa chỉ hàm

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; 

các đối số dấu chấm động được chuyển như thế nào?

+1

Trên ngăn xếp, như mọi thứ khác. PS: bạn không cần nạp con trỏ vào 'EAX', bạn có thể thực hiện' gọi dword ptr [Address] '. Cũng lưu ý rằng nếu bạn sử dụng 'push', bạn cần phải đảo ngược thứ tự đối số. – Jester

+0

Quy ước cuộc gọi thường phụ thuộc vào ngôn ngữ, kiến ​​trúc và hệ điều hành. Trên các giá trị dấu phẩy động x86 được đẩy lên ngăn xếp dấu chấm động. – qznc

+2

@qznc, thậm chí không gần. – Johan

Trả lời

2

Microsoft rất im lặng về vấn đề này.
Điều này là do stdcall chỉ được sử dụng cho các cuộc gọi WinAPI.
Và không có lệnh gọi WinAPI nào mà tôi biết chấp nhận tham số dấu chấm động.

According đến alldocumentation Tôi có thể tìm thấy tất cả các thông số được đẩy lên ngăn xếp.
Điều này bao gồm các thông số dấu phẩy động.

Nếu tôi biên dịch đoạn mã sau đây trong trình biên dịch của tôi nó xác nhận điều này:

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 

Lưu ý rằng một giá trị điểm trở lại nổi được trả lại trong ST(0).

Các vấn đề liên quan