2011-08-21 13 views
7

Tôi đang học x64 lắp ráp trên Windows cho 'vui'. MSDN documentation for the x64 calling convention on Windows nói:Trong Win64 ABI, không gian ngăn xếp đối số dành riêng có được sử dụng cho mục đích lưu trữ chung không?

Người gọi có trách nhiệm phân bổ đủ không gian cho thông số đăng ký, ngay cả khi callee không có nhiều tham số. Điều này hỗ trợ trong sự đơn giản của việc hỗ trợ các hàm không được định kiểu C và các hàm C/C++.

Như chức năng của tôi không phải là C chức năng unprototyped hoặc varargs C/C++ chức năng, không có nghĩa là tôi luôn có thể sử dụng [rsp+8]-[rsp+32] (giả định một giá trị chưa sửa đổi của rsp ngay sau khi một cuộc gọi) để lưu trữ mục đích chung trong chức năng của tôi , giống như cho các biến cục bộ?

Trả lời

6

Có, bạn có thể sử dụng không gian đầu vào tham số vào cho mọi mục đích. Nhưng bạn đã biết điều này rồi: Quyền thực hiện điều này đã được ngụ ý bởi tính hợp pháp của việc sửa đổi các tham số gửi đến.

void somefunction(int arg1) 
{ 
    arg1 = anyvalue; // mov [rsp+8], anyvalue 
} 
+0

Cảm ơn câu trả lời rõ ràng. Tuy nhiên việc sửa đổi các tham số gửi vào sẽ là 'mov rcx, anyvalue' khi đối số được truyền qua' rcx', đó là lý do tại sao tôi không chắc chắn về '[rsp + 8]'. – Trillian

+3

Nhưng bạn cũng được phép làm đổ các thông số gửi đến. Đó là lý do tại sao không gian dành riêng là có, sau khi tất cả. 'void somefunction (int arg1) {/ * tràn: mov [rsp + 8], rcx */arg1 = anyvalue;/* mov [rsp + 8], anyvalue * /} ' –

1

Tôi nghĩ rằng những gì ông đang cố gắng làm là hơn một cái gì đó như thế này:

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue 

Theo như tôi hiểu, Microsoft khẳng định rằng bạn được yêu cầu phải bố trí đủ không gian cho đối tượng được gọi để lưu trữ Bốn các thanh ghi (rcx, rdx, r8. r9), ngay cả trong một hàm chỉ nhận một đối số (trong rcx).

Lưu ý: Tôi xin lỗi về mã c xấu xí và phép đúc cũ được trộn lẫn với từ khóa decltype mới