2011-12-02 33 views
16

Tôi hiện đang học lắp ráp cho các bộ xử lý Intel. Kể từ khi chồng 'mọc xuống', tại sao chúng ta phải bổ sung để truy cập vào một yếu tố cụ thểsổ đăng ký lắp ráp esp và ebp

[ebp + 8] ;; This will access the first param 

tôi konw chúng ta phải bỏ qua giá trị ebp cũ và địa chỉ trả lại và đó là lý do tại sao chúng tôi sử dụng 8 (vì mỗi cái dài 4 byte). Điều này thật kỳ lạ.

_start: 

;; what's ebp value here ? 

push eax 
push ebx 
call someFunction ;; this will create a stack frame 

+-----------+ 
| param1 | 
+-----------+ 
| param0 | <--- this is [ebp + 8] (assuming mov ebp, esp) 
+-----------+ 
|ret_address| 
+-----------+ 
| ebp | 
+-----------+ <--- esp 

Và cũng có khi chúng tôi phân bổ bộ nhớ cho người dân địa phương, chúng ta phải trừ:

Ngoài ra, nếu ebp là một bản sao lưu cho đặc biệt, giá trị ebp trong những chức năng chính Ex là gì từ ebp ... Vui lòng cung cấp câu trả lời không mơ hồ. Cảm ơn bạn!

+1

Chức năng chính() không khác với chức năng thông thường, nó cũng có phần mở đầu. Bạn đã không hiển thị một trong đoạn mã lắp ráp của mình, không chắc chắn lý do. Không gian cho người dân địa phương được tạo ra bằng cách điều chỉnh esp, chứ không phải ebp. –

+0

Có cùng một câu hỏi: http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point và liên kết khác với nó – Abyx

Trả lời

2

Cũng giống như bạn đã nói, ngăn xếp phát triển. Vì vậy, bạn trừ để phát triển ngăn xếp cho người dân địa phương. Bạn thêm vào để nhìn lại trong ngăn xếp cho các phần tử được lưu trữ ở đó.

13

Giá trị ban đầu cho %ebp thường là 0. Đây là những người gỡ rối biết khi nào kết thúc theo chuỗi liên kết trong một backtrace.

Bạn nên nghĩ đến %ebp làm điểm tham chiếu. Để thuận tiện, nó được đặt giữa các đối số hàm và các biến cục bộ. Bằng cách đó, bạn truy cập các đối số với một chênh lệch dương, và các biến có một giá trị offset âm, vì vậy thật dễ dàng để biết liệu bạn đang truy cập một biến hay một đối số.

+0

Tại sao 0? Ban đầu khi CPU được bật nguồn? – Abyx

+0

'% ebp' thường được khởi tạo bằng 0 bởi bộ nạp hoặc thư viện thời gian chạy. Việc khởi tạo thành 0 đôi khi được chỉ định trong một tài liệu chính thức (ví dụ: IIRC ELF x86 psABI chỉ định nó). – ninjalj

+0

trình tải gì hoặc thời gian chạy là gì? Nếu bạn đang nói về hệ điều hành cụ thể, hãy nêu rõ nó. Trên hệ điều hành của tôi 'ebp' không được khởi tạo đến 0, ít nhất là trong chế độ người dùng. Ngoài ra, để chính xác, tên đăng ký là 'ebp', không phải'% ebp'. '%' là tiền tố cho tên đăng ký. – Abyx

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