2009-03-23 44 views
9

Một số có thể cung cấp ví dụ sử dụng fastcall để sử dụng với gcc không? Nếu có thể, bạn có thể cung cấp cuộc gọi tương đương mà không sử dụng fastcall và giải thích cách chúng khác nhau không?Ví dụ về Fastcall GCC

Trả lời

17

Không có sự khác biệt trong cách gọi chức năng nhất định sẽ xuất hiện trong mã C. Sự khác biệt duy nhất là trong khai báo hàm. GCC manual có thêm chi tiết.

$ cat fastcall.c 
extern void foo1(int x, int y, int z, int a) __attribute__((fastcall)); 
extern void foo2(int x, int y, int z, int a); 

void bar1() 
{ 
    foo1(99, 100, 101, 102); 
} 

void bar2() 
{ 
    foo2(89, 90, 91, 92); 
} 

$ gcc -m32 -O3 -S fastcall.c -o - 
. 
. 
bar1: 
. 
.  
    movl $100, %edx 
    movl $99, %ecx 
    movl $102, 4(%esp) 
    movl $101, (%esp) 
    call foo1 
. 
. 
bar2: 
. 
. 
    movl $92, 12(%esp) 
    movl $91, 8(%esp) 
    movl $90, 4(%esp) 
    movl $89, (%esp) 
    call foo2 
+1

Bạn có cần hiển thị dọn dẹp sau cuộc gọi để nhấn mạnh sự khác biệt không? +1 cho hướng dẫn sử dụng x-ref. –