2014-06-17 15 views
6

tôi đang tìm kiếm tại dissasembly của một cuộc gọi chức năng và thấy điều này:Tại sao ngăn xếp ngăn xếp trên một cuộc gọi chức năng?

movq %rsp, %rbp 
pushq %rbx 
subq $136, %rsp  ; Pad the stack 
.... 
addq $136, %rsp  ; Unpad the stack 
popq %rbx 
popq %rbp 
ret 

giá trị để làm điều này là gì?

+1

Truy cập nhanh hơn vào ranh giới địa chỉ bộ nhớ thích hợp (như với bất kỳ phần đệm nào). –

+0

Ồ, khi truy cập bộ nhớ bằng cách bù đắp nhanh hơn truy cập bộ nhớ bằng cách thực hiện 'push'? – sircodesalot

+3

Tôi cho rằng họ đang dành không gian cho các biến cục bộ với phạm vi chức năng. Sau đó, bạn phải đặt con trỏ ngăn xếp ở đúng vị trí để không làm phiền khung ngăn xếp (để trở về đúng vị trí trong chương trình). –

Trả lời

12

Đó là không gian cho các biến cục bộ, không phải đệm.

Trình biên dịch sẽ tạo không gian ngăn xếp đó cho bất kỳ sự cố tràn đăng ký nào và các biến cục bộ mà nó phải lưu trữ trong khi chạy hàm này.

Bạn có thể thấy một số đệm, khi tháo mã x86-64 bằng SysV ABI (hầu hết mọi thứ không phải là Windows, tôi không biết nó như thế nào sau này), vì các cuộc gọi hàm phải có ngăn xếp được căn chỉnh ở 16 byte. Nhưng trong trường hợp này, nó thực sự dành không gian cho các biến cục bộ.

Bạn có thể muốn xem this hoặc tìm thêm thông tin về cách trình biên dịch hoạt động.

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