2012-04-22 9 views
26

코드의 조각을 감안할 때 : 왜 우리는 기본 포인터에 8을 추가하여 첫 번째 매개 변수의 주소를 얻은 다음 12를 얻는가?자료 포인터와 스택 포인터

나는 그들이 각각 4 바이트라는 사실을 알게되었다. 그래서 ebp + 8에서 ebp + 12로 만들면 센세이션을 만든다. 하지만 첫 번째 것이 ebp + 8 인 이유는 무엇입니까? ESP가 스택의 TOP를 가리키는 경우 mov ebp, esp는 EBP가 스택의 TOP을 가리킴을 의미합니다. 그런 다음 eax, ebx, ecx 및 edx와 같은 스택에 4 개의 값을 푸시합니다. EBP + 8이 첫 번째 매개 변수를 가리키는 이유는 무엇입니까? 함수가 호출 될

답변

39

, 스택과 같이 보인다 :

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

은 "스택 프레임은"설정 후 후 :

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

지금 상황이 저장됩니다

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

많은 시스템에서 스택이 아래쪽으로 커짐을 잊지 마십시오. 따라서 x86 패밀리의 경우에도 마찬가지입니다. 스택 맨 위에는 가장 낮은 메모리 주소가 있습니다.

+0

+1 - 간단하고 깨끗하며 유익합니다. – Cyclonecode

+0

와우 꽤 깨끗합니다! 고마워요. 매우 도움이되었습니다. 요점은 스택이 아래로 자라는 것입니다! 알아 둘만한 ! 너는 내 하루를 보냈다. – yhcowboy

5

다른 두 개의 항목이 스택에 있기 때문에; 이 루틴의 시작 부분에서 이전 ebp 및 루틴 호출에 의해 스택에 놓이는 리턴 주소.

+0

나는 반송 주소가 스택에 푸시되었다고 결코 생각하지 못했을 것입니다! 고마워. – yhcowboy