2011-09-17 29 views
5

Điều duy nhất mà tôi biết về cơ chế của cách C truyền các giá trị là nó được thực hiện thông qua một thanh ghi hoặc ngăn xếp.Các đối số chức năng được truyền trong C như thế nào?

Đăng ký hoặc ngăn xếp? Chính xác như thế nào?

+2

Về mặt kỹ thuật, đây là chi tiết triển khai và do đó, mỗi trình biên dịch C có thể chọn chuyển đối số chức năng theo cách mà nó muốn. – jwodder

Trả lời

5

Cả hai. Và các quy ước sẽ thay đổi theo nền tảng.

Trên x86, giá trị thường được chuyển bởi ngăn xếp. Trên x64, đi qua đăng ký được ưa thích.

Trong mọi trường hợp, nếu bạn có quá nhiều tham số, một số thông số sẽ phải được chuyển bởi ngăn xếp.

Tham khảo x86 calling conventions

+2

Cũng cần lưu ý rằng có sự khác biệt trong các quy ước gọi ngay cả đối với một kiến ​​trúc nhất định. So sánh 'cdecl' (được sử dụng trong Linux?) Và' stdcall' (WinAPI?), Chẳng hạn. –

+1

Đồng ý. Phần dưới cùng của trang wikipedia này có biểu đồ hiển thị các quy ước khác nhau trên các hệ điều hành khác nhau và thậm chí trong cùng một hệ điều hành. – Mysticial

+0

@ Mystical Đây là một liên kết tốt - nhưng tôi nghĩ rằng một số thông tin bổ sung nên được đưa vào/cùng với câu trả lời. –

3

thường (một số trình biên dịch sẽ làm điều đó khác nhau như chỉ ra) cho chức năng bình thường gọi họ được truyền trên stack. Đó thường là một loạt các hướng dẫn đẩy mà chỉ cần đưa dữ liệu vào ngăn xếp.

Có những trường hợp đặc biệt như cuộc gọi hệ thống trong đó các thông số được truyền qua hướng dẫn lắp ráp và thanh ghi. Trong trường hợp phần cứng chúng được truyền qua thanh ghi hoặc thậm chí một số tín hiệu gián đoạn do đó ghi vào sổ đăng ký.

Trên kiến ​​trúc có số lượng đăng ký cao, chúng thường được chuyển qua các thanh ghi như một số kiến ​​trúc RISC và 64 bit.

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