2009-10-08 27 views
6

Từ: http://en.wikipedia.org/wiki/X86_calling_conventionsTại sao người gọi phải xóa ngăn xếp trong quy ước gọi điện thoại cdecl?

push c 
push b 
push a 
call function_name 
add esp, 12 ;Stack clearing 
mov x, eax 

Tại sao chúng ta cần phải rõ ràng thêm từ 12 đến ESP để xóa chồng kể từ khi được gọi là chức năng nên đã poped các thông số ra khỏi stack do đó khôi phục lại con trỏ ngăn xếp ...?

Một câu hỏi:

Về mặt lý thuyết, nó sẽ có thể để thực hiện chức năng tham số biến với callee chăm sóc dọn dẹp ngay (ví dụ nếu bạn vượt qua số lượng các đối số trên stack trong một thanh ghi)?

Trả lời

19

Bởi vì, với quy ước gọi điện C, hàm được gọi sẽ không bật thông số. Đó là điểm của quy ước gọi điện này.

Nó cho phép những thứ như đối số biến.

+0

Chính xác. Với chức năng C, người gọi có thể đẩy nhiều đối số trên ngăn xếp như trước khi gọi một hàm. Hàm được gọi đơn giản là không biết bao nhiêu nên được làm sạch. –

+1

callee biết bao nhiêu tham số được gọi để nó có thể truy cập chúng một cách an toàn? Trong trường hợp printf() nó có thể phân tích chuỗi định dạng nhưng nếu không thì nó sẽ làm như thế nào? – anon

+0

http://en.wikipedia.org/wiki/Stdarg.h –

6

Đó là ngay trên trang wikipedia trên header _cdecl

Trong những ước người gọi làm sạch các đối số từ ngăn xếp, cho phép danh sách đối số thay đổi, ví dụ. printf().

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