Chỉ cần bắt đầu học x64 lắp ráp và tôi có một câu hỏi về chức năng, đối số và ngăn xếp. Theo như tôi hiểu, bốn đối số đầu tiên trong một hàm được chuyển tới các thanh ghi rcx, rdx, r8 và r9 (và xmm0-xmm3 cho các float) trong Windows. Vì vậy, một hàm addition tầm thường với bốn thông số sẽ trông như thế này:Có dành không gian ngăn xếp cần thiết cho các chức năng ít hơn bốn đối số không?
add:
mov r10, rcx
add r10, rdx
add r10, r8
add r10, r9
mov rax, r10
ret
Tuy nhiên, tôi đã đi qua documentation that mentions this:
Tối thiểu, mỗi chức năng phải dự trữ 32 byte (bốn 64 giá trị bit) trên ngăn xếp. Không gian này cho phép đăng ký được chuyển vào hàm để dễ dàng sao chép vào vị trí ngăn xếp nổi tiếng. Chức năng callee là không cần thiết để tràn các thông số đăng ký đầu vào vào ngăn xếp, nhưng việc đặt chỗ ngăn xếp sẽ đảm bảo rằng nó có thể nếu cần thiết.
Vì vậy, tôi có phải đặt trước không gian ngăn xếp ngay cả khi các chức năng tôi đang thực hiện lấy bốn tham số hoặc ít hơn hoặc chỉ là đề xuất?
http://www.agner.org/ optimization/optimizing_assembly.pdf Chương 4 có một ví dụ cho thấy rằng bạn phải * luôn luôn * không gian dự trữ. – user786653
Rất tiếc, đã quá muộn để chỉnh sửa. [oldnewthing] (http://blogs.msdn.com/b/oldnewthing/archive/2004/01/14/58579.aspx) mục blog trên quy ước gọi điện thoại amd64. – user786653
Một phần khác của câu đố cho bạn: bạn có một chức năng *** lá ***, có nghĩa là nó không gọi các chức năng khác. – jww