스택에 대해 자세히 알고 싶습니다. 특히 매개 변수가있는 함수가 호출되면 어떻게됩니까? 이를 위해, 나는 다음과 같은 코드 쓰기 :매개 변수가있는 함수를 사용하여 스택에서 ebp 및 esp의 동작
#include <stdio.h>
int sum(int d, int e, int f){
int result = d + e + f;
return result;
}
int main(void){
int a = 5;
int b = 4;
int c = 2;
int erg = sum(a,b,c);
printf("Result is: %d", erg);
}
을 나는 (처음에는이 부분을 이해하기 원하기 때문에 내가에만 main
기능의 일부를 추가합니다) 다음 어셈블리 코드를 얻을 :
push ebp,
mov ebp, esp
and esp, -16
sub esp, 32
mov DWORD PTR[esp+28], 5
mov DWORD PTR[esp+24], 4
mov DWORD PTR[esp+20], 2
mov eax, DWORD PTR[esp+20]
mov DWORD PTR[esp+8], eax
mov eax, DWORD PTR[esp+24]
mov DWORTD PTR[esp+4], eax
mov eax, DWORD PTR[esp+28]
mov DWORD PTR[esp], eax
call sum
........
........
이 부분에 대해서는 나 자신을 위해 약간의 스케치를 그립니다. 제발 좀보세요 :) 내 질문 : 그 시점에서 내 ebp
은 무엇입니까? 어셈블러 코드의 2 행 때문에 같은 위치에 있어야합니다 ([esp]
)?
이제 제 2의 질문에 이어지는 합계 기능의 부분.
push ebp
mov ebp, esp
sub esp, 16
mov eax, DWORD PTR[ebp+12]
mov edx, DWORD PTR[ebp+8]
mov edx, eax
------------
그래서, 나는 우리가 [eb+12]
및 [ebp+8]
항상 우리의 매개 변수를 찾을 수 있다는 것을 배웠습니다 :
그래서 여기에의 어셈블리 코드입니다. 내가 그 esp
= ebp
을 가정하면 을하고 내 스케치를 보면 그때 [esp+12]
아무것도이나 지금 [ebp+12]
이 없다는 것을 참조 : 그래서 내 질문에 지금 (나는 간단하게 원하기 때문에 나는 세 번째 매개 변수를 생략). 그러나 그럼에도 불구하고, 그것은 사용됩니다. 어떻게 상상할 수 있습니까?
나를 도와 줄 사람이 있습니까? 나는 많은 논문을 읽었지 만 아무도 이런 것들을 스케치하지 않는 것 같습니다. 그 때문에, 그것을 이해하는 것은 매우 어렵습니다.
감사합니다.