int factorial (int n) {
if (n <= 1)
return 1;
return n * factorial(n-1);
}
int main() {
int result = factorial(5);
return 0;
}
factorial:
push ebp
mov ebp, esp
sub esp, 8
cmp DWORD PTR [ebp+8], 1
jg .L2
mov eax, 1
jmp .L3
.L2:
mov eax, DWORD PTR [ebp+8]
dec eax
sub esp, 12
push eax
call factorial
add esp, 16
imul eax, DWORD PTR [ebp+8]
.L3:
leave
ret
main:
lea ecx, [esp+4]
and esp, -16
push DWORD PTR [ecx-4]
push ebp
mov ebp, esp
push ecx
sub esp, 20
sub esp, 12
push 5
call factorial
add esp, 16
mov DWORD PTR [ebp-12], eax
mov eax, 0
mov ecx, DWORD PTR [ebp-4]
leave
lea esp, [ecx-4]
ret
lea ecx, [esp+4]
and esp, -16
push DWORD PTR [ecx-4]
저기서 다 이해가다가 이구간에서 대가리가 멈춤
구글링해보니까 스택 정렬하고 뭐 어쩌구라던데
재귀함수에서 왜 저런게 쓰이는지 설명좀 부탁해요 ㅇㅅㅇ
대충 메인함수는 운영체제랑 통신해야하니까 이상한거 껴있다 - dc App
함수 프롤로그 앞에 있어서 내부 코드랑은 상관 없을듯ㅇㅅㅇ
https://stackoverflow.com/a/59332752
1:3은 재귀함수랑 관련없고 이전에 쓰던 레지스터값을 스택에 저장할려고하는거임 add -16은 sub +16이랑 같은거임 최적화과정에서 저렇게나옴
add가 아니라 and인데?
아 and구나 ㅈㅅㅈㅅ 그럼 4비트 마스킹이라 새 스택프레임 전에 esp레지스터 값 비우는 역할일듯 아마도 최적화때문일거임
스택 포인터 주소 16으로 나누어 떨어지게 정렬 맞추는거네