스택 프레임

namu·2022년 7월 3일

함수 별로 사용하는 스택 메모리

int result = MultiplyBy(b, a)
mov eax, dword ptr [a] // 맨 오른쪽에서부터 스택에 넣는다.
push eax // 스택에 eax 값이 들어가면서 esp가 갱신됨.
mov ecx, dword ptr [b]
push ecx // 스택에 ecx 값이 들어가면서 esp가 갱신됨.
call MultiplyBy (07114ABh) // 'add esp, 8' 명령어 주소를 스택에 저장하면서 07114ABh로 jump
add esp, 8
mov dword ptr [result], eax

call와 jump의 차이는 반환 주소값을 넣어주는지 여부
call이 동작할 때 스택에 그 다음 명령어 주소가 들어간다.

MultiplyBy:
007114AB jmp MultiplyBy (0712570h)
int MultiplyBy(int a, int b)
{
00712570 push ebp // ebp 스택에 저장
mov ebp, esp // ebp esp로 갱신
sub esp, 0CCh // esp 갱신
push ebx
push esi
push edi
...
	int c = a * b;
mov eax, dword ptr [a]
imul eax, dword ptr [b]
mov dword ptr [c], eax
	return c;
mov eax, dword ptr [c]
}
pop edi
pop esi
pop ebx
add esp, 0CCh // esp 복원, 이전 ebp값이 들어있는 스택 주소를 가리킴.
cmp ebp, esp
call __RTC_CheckEsp (071128Fh)
mov esp, ebp
pop ebp // 스택에 저장했던 ebp값 복원
ret // 해당하는 주소로 돌아가겠다. 이때의 esp는 반환 주소값을 가진 곳을 가리키고, ret 명령이 수행되면, esp는 반환 주소값을 가진 곳을 지나 매개변수가 저장된 곳을 가리킨다.
add esp, 8 // esp에 매개변수 사이즈만큼을 더한다.
mov dword ptr [result], eax // eax에 저장된 return 값을 result 변수에 대입한다.
profile
안녕하세요

0개의 댓글