2012-04-22 62 views
26

Với đoạn mã này:cơ sở con trỏ và con trỏ ngăn xếp

 swap: 

      push ebp ; back up the base pointer, 
      mov ebp, esp 
      ; push the context of the registers on the stack 

      push eax 
      push ebx 
      push ecx 
      push edx 

      mov eax, [ebp+8] ; address of the first parameter 
      mov ebx, [ebp+12] ; address of the second parameter 
      mov dl, [eax] 
      mov cl, [ebx] 

      mov [eax], cl 

      mov [ebx], dl 

      ; restore the context of the registers from the stack 

      pop edx 
      pop ecx 
      pop ebx 
      pop eax 
      ; restore the ebp 
      pop ebp 
      ret 

(Đây chỉ là phương pháp Trước đây chúng ta đẩy đầu tiên và tham số thứ hai trên stack..)

Câu hỏi của tôi là: tại sao chúng ta thêm 8 vào Base Pointer để đến địa chỉ của tham số đầu tiên và sau đó là 12?

Tôi nhận được thực tế là chúng là dword để mỗi người trong số họ là 4 byte .. do đó từ ebp + 8 đến ebp + 12 nó tạo ra cảm giác để thực hiện. Nhưng tại sao cái đầu tiên là ebp + 8? Bởi vì nếu ESP trỏ đến TOP của stack, mov ebp, esp có nghĩa là EBP trỏ tới TOP của stack. Sau đó, chúng tôi đẩy 4 giá trị trên ngăn xếp: eax, ebx, ecx và edx. Tại sao EBP + 8 chỉ vào tham số đầu tiên?

Trả lời

39

Khi hàm được gọi, chồng trông giống như:

+-------------+ 
| Parameter 2 | 
+-------------+ 
| Parameter 1 | 
+-------------+ 
| Return Addr | <-- esp 
+-------------+  

sau đó sau khi "stack frame" được thiết lập:

+-------------+ 
| Parameter 2 | <-- [ebp + 12] 
+-------------+ 
| Parameter 1 | <-- [ebp + 8] 
+-------------+ 
| Return Addr | 
+-------------+  
| saved ebp | <-- ebp 
+-------------+ <-- esp 

Bây giờ bối cảnh được lưu:

+-------------+ 
| Parameter 2 | <-- [ebp + 12] 
+-------------+ 
| Parameter 1 | <-- [ebp + 8] 
+-------------+ 
| Return Addr | 
+-------------+  
| saved ebp | <-- ebp 
+-------------+ 
| saved eax | 
+-------------+  
| saved ebx | 
+-------------+  
| saved ecx | 
+-------------+  
| saved edx | <-- esp 
+-------------+  

Đừng quên rằng trên nhiều hệ thống ngăn xếp phát triển xuống (và điều đó chắc chắn đúng với họ x86), vì vậy đầu ngăn xếp sẽ có địa chỉ bộ nhớ thấp nhất.

+0

+1 - Đơn giản, sạch sẽ và mang tính thông tin. – Cyclonecode

+0

Wow khá sạch sẽ! Cảm ơn điều này rất hữu ích! Tôi đoán điểm chính là Stack phát triển xuống! Tốt để biết! Bạn đã làm cho ngày của tôi. – yhcowboy

5

Vì có hai mục khác trên ngăn xếp; ebp trước đó, mà bạn đẩy vào đầu của thói quen này, và địa chỉ trả về, được đặt trên ngăn xếp bằng cách gọi đến thường trình.

+0

Tôi chưa bao giờ nghĩ rằng địa chỉ trả lại đã được đẩy lên ngăn xếp! Cảm ơn rất nhiều – yhcowboy

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