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
9
A
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
2
Dưới đây là một số liên kết
Is it possible to convince GCC to mimic the fastcall calling convention?
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. –