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!
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. –
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