2012-06-28 22 views
15

Lắp ráp x86 học tập và con trỏ khung đang thổi tâm trí của tôi một chút. Tôi đã học được từ điều này SO question rằng EBP làm cho cuộc sống tuyệt vời để gỡ lỗi. Điều đó thật tuyệt, nhưng tôi tò mò, "EBP khác được sử dụng để làm gì?" Nhìn vào bài viết Wikipedia call stack, EBP là cần thiết cho phân bổ stack động.Thanh ghi EBP (con trỏ khung cơ sở) chỉ để gỡ lỗi trong x86?

Như tôi đã luôn luôn được giả định rằng phân bổ động đi trên heap. Vì vậy, tại sao tôi muốn sử dụng phân bổ stack động - tại sao không phải là đống tốt đủ? Và, EBP hữu ích như thế nào cho điều này?

+2

Hah, được đánh dấu là trùng lặp gần ba năm sau đó. – CatShoes

Trả lời

9

Phân bổ lượng bộ nhớ nhỏ từ ngăn xếp cực kỳ nhanh so với phân bổ heap. Khi chúng tôi cấp phát bộ nhớ từ heap thì chúng ta phải gọi API hoặc bộ quản lý bộ nhớ.

bạn có thể sử dụng EBP cũng như bất kỳ mục đích nào khác như thanh ghi 32 bit khác.

Bạn có thể sử dụng PUSH EBP để lưu trữ nội dung EBP vào ngăn xếp và POP EBP để khôi phục.

+0

EBP EBP/POP EBP của bạn có đề cập đến cùng được tạo bởi trình biên dịch cho các cuộc gọi chức năng không? – CatShoes

+0

@CatShoes: Thông thường trình biên dịch sử dụng EBP đăng ký để truy cập vào các biến động được phân bổ stack như con trỏ bộ nhớ stack vì vậy nếu thủ tục asm của bạn là ở giữa mã chương trình bạn phải bảo toàn nội dung của EBP. –

+0

Được rồi, vì vậy đây là ngoài việc sử dụng trình biên dịch tạo ra EBP. Cảm ơn! – CatShoes

19

Bạn giả định sai rằng ebp là cần thiết để phân bổ khung ngăn xếp. Điều này không đúng, esp có thể được sử dụng trực tiếp. Việc sử dụng ebp làm con trỏ khung ngăn xếp hiện không cần thiết. Có một vài điểm, nơi được là hữu ích:

  • Trong 16 bit mã, việc sử dụng sp (stack pointer) trong việc giải quyết là nghiêm trọng hạn chế, liên quan giải quyết vấn đề không phải là trực tiếp càng tốt ở tất cả trong x86, nơi có thể sử dụng bp trong mọi chế độ địa chỉ có sẵn.

  • Lý do cho sự hỗ trợ có giới hạn này có thể là các trình biên dịch có sẵn, sau đó đơn giản hơn để tạo mã bằng các con trỏ khung để theo dõi sự thay đổi sp. Có nhiều hơn các bộ xử lý trong đó có hỗ trợ đặc biệt để được hướng dẫn stack frame, như leave hoặc enter, nhưng AFAIK không ai khác nhưng Intel đã đi quá xa để làm tê liệt thực sự sp trong quá trình đó :-)

  • Debugging. Nó dễ dàng hơn nhiều để thư giãn một chồng khi các con trỏ khung có sẵn, nhưng các trình gỡ rối hiện đại có thể làm ngay cả khi không có.

Nếu bạn muốn phân bổ không gian 100 byte trên stack, chỉ cần làm sub esp, #100, truy cập vào không gian với move [esp + x] nơi x là giữa 0 và 99 và dọn dẹp với add esp, #100 và bạn đã làm xong. Tôi thậm chí còn cho rằng việc sử dụng các con trỏ khung xếp chồng trong bản viết tay cũng giống như sao chép hành vi của trình biên dịch ba mươi tuổi, khi các trình biên dịch thực sự ngu ngốc và không thể làm được mà không có. Đó là trong không cách cần thiết cũng không hữu ích nếu bạn đang viết lắp ráp.

+0

Xin hãy tha thứ cho tôi, tôi hơi dày đặc. Bạn có nói rằng nó là nhiều hơn hoặc ít vô nghĩa để sử dụng EBP cho con trỏ khung stack, và thay vì sử dụng ESP cho rằng và EBP như một mục đích chung đăng ký? – CatShoes

+0

Có, tôi đang nói rằng việc sử dụng con trỏ khung thường lỗi thời. Đó là một điều từ quá khứ mà vẫn có xu hướng dính quanh :-) – hirschhornsalz

+0

Tuyệt vời. Tôi đánh giá cao những thông tin hữu ích. Tôi đã chọn câu trả lời khác, nhưng cảm thấy của bạn là hữu ích như nhau. Đã bỏ phiếu! – CatShoes

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