2012-08-23 33 views
5

Tôi đã đọc Microsoft's documentation, nhưng chương trình này là rất vụng về, tôi nghĩ rằng tôi muốn kiểm tra lại để chắc chắn rằng tôi đang tìm hiểu nó một cách chính xác ...x64 gọi hội nghị (stack) và varargs

hiểu biết của tôi là phương pháp chung mà các tham số được truyền được này:

--- bottom of stack --- 
(return address) 
[shadow space for arg 1] 
[shadow space for arg 2] 
[shadow space for arg 3] 
[shadow space for arg 4] 
arg N 
arg N - 1 
arg N - 2 
... 
arg 6 
arg 5 
---- top of stack ----- 

có vẻ như rất lúng túng khi thực hiện va_arg và như vậy ... đây là thực sự đúng?

+0

Điều đó không thể đúng: không gian bóng cho args 1-4 tiếp giáp với địa chỉ trả lại, theo http://msdn.microsoft.com/en-us/library/ew5tede7 –

+0

Ngoài ra địa chỉ trả lại là ở dưới cùng của ngăn xếp, không phải trên cùng. –

+0

@HarryJohnston: Ồ, tệ lắm, bạn nói đúng, cảm ơn ... không chắc tôi đang nghĩ gì ở đó; đã sửa. Phần còn lại có chính xác không? – Mehrdad

Trả lời

6

Sơ đồ đúng là

--- Bottom of stack --- RSP + size  (higher addresses) 
arg N 
arg N - 1 
arg N - 2 
... 
arg 6 
arg 5 
[shadow space for arg 4] 
[shadow space for arg 3] 
[shadow space for arg 2] 
[shadow space for arg 1] 
(return address) 
---- Top of stack ----- RSP   (lower addresses) 
[grows downward] 

Địa chỉ hồi âm là ở phía trên cùng của ngăn xếp (gần đây nhất là đẩy), tiếp theo là không gian bóng cho bốn thông số đầu tiên, tiếp theo là các thông số 5 trở đi.

Các tham số được đẩy sang phải sang trái: Tham số cuối cùng (N) được đẩy đầu tiên, vì vậy nó gần nhất với đáy của ngăn xếp.

+0

Giữ trên - ngăn xếp phát triển xuống dưới, phải không, vì vậy mục đầu tiên được đẩy gần nhất với * đầu *? Như trong câu thứ hai ở đây: http://msdn.microsoft.com/en-us/library/ew5tede7 –

+0

@HarryJohnston Kể từ khi ngăn xếp phát triển xuống, mục ở trên cùng của ngăn xếp (gần đây nhất đẩy) có địa chỉ thấp nhất. Nó nằm ở dưới cùng của khung ngăn xếp sau khi bạn trừ không gian cho các biến cục bộ. Stack frame = parameters [bottom], địa chỉ trả về [middle], local [top]. Xem sơ đồ. Bạn đang bối rối không gian tham số với toàn bộ khung ngăn xếp. –

+0

Vâng, tôi chắc chắn có thuật ngữ của tôi lẫn lộn. Tôi vẫn còn hơi bối rối về ý nghĩa của câu trong bài viết MSDN tham chiếu - điều đó có nghĩa là vùng tham số nằm ở cuối ngăn xếp * từ quan điểm của callee *? –

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