2013-07-02 43 views
6

Tôi đọc một trong những hướng dẫn sử dụng Agner Sương mù và là một lợi thế cho 64 bit Hệ điều hành (trên 32 bit), ông nói: thông sốCác thông số chức năng được chuyển trong thanh ghi trên hệ điều hành 64bit?

Chức năng được chuyển vào sổ đăng ký chứ không phải trên stack. Điều này làm cho các cuộc gọi chức năng hiệu quả hơn.

Có phải anh ấy nói ngăn xếp không được sử dụng để chuyển các tham số chức năng (64bit OS)?

Trả lời

13

Vâng, đó là những gì anh ấy nói, nhưng nó không hoàn toàn chính xác. Ngăn xếp có thể được sử dụng, nhưng chỉ khi chức năng của bạn có số các thông số (hoặc bạn viết mã buộc tràn).

Nếu bạn xem wikipedia list of 64-bit intel calling conventions, bạn sẽ thấy thanh ghi được sử dụng để chuyển một số thông số đầu tiên. Có hai quy ước gọi điện lớn Intel 64 bit. Đối với Microsoft ABI:

Microsoft x64 ước kêu gọi sử dụng thanh ghi RCX, RDX, R8, R9 cho bốn số nguyên hoặc con trỏ đối số đầu tiên (theo thứ tự từ trái qua phải), và XMM0, XMM1, XMM2, XMM3 được sử dụng cho các đối số dấu chấm động. Các đối số bổ sung được đẩy lên ngăn xếp (phải sang trái). Các giá trị trả về số nguyên (tương tự x86) được trả về trong RAX nếu 64 bit trở xuống. Các giá trị trả về dấu chấm động được trả về trong XMM0. Các tham số nhỏ hơn 64 bit không được mở rộng bằng 0; các bit cao chứa rác.

Và System V ABI:

Sáu nguyên đầu tiên hoặc con trỏ đối số được truyền trong thanh ghi RDI, RSI, RDX, RCX, R8, và R9, trong khi XMM0, XMM1, XMM2, XMM3 , XMM4, XMM5, XMM6 và XMM7 được sử dụng cho các đối số dấu chấm động ... Như trong quy ước gọi điện thoại x64 của Microsoft, các đối số bổ sung được chuyển vào ngăn xếp và giá trị trả về được lưu trữ trong RAX.

+0

Tôi đoán điều này liên quan đến một tuyên bố khác mà anh ấy nói rằng 64 bit Linux có thể chuyển nhiều tham số hơn vào thanh ghi hơn Windows 64 bit? "Trong 64 bit Linux sáu thông số nguyên đầu tiên và tám tham số điểm nổi đầu tiên được chuyển vào sổ đăng ký. Trong Windows 64 bit, 4 thông số đầu tiên được chuyển ....." – user997112

+0

Vâng, đúng vậy. Linux sử dụng SYSV ABI, sử dụng nhiều thanh ghi hơn để truyền tham số. –

+0

Đó có phải là SYSV ABI có thứ gì đó luôn bị "ẩn" trong các CPU Intel và Linux đã chọn tận dụng lợi thế của nó chứ không phải Windows? – user997112