인프런 커뮤니티 질문&답변

지혁김님의 프로필 이미지
지혁김

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

스택 프레임

스택프레임 질문

작성

·

115

0

복습하려고 제 코드를 디스어셈블리어로 분석하는 도중 위 강의에선 main함수의 a,b의 값을 전달하기위해 컴파일러가 eax,ebx 레지스터에 그 값을 복사하고 그것들을 push를 통해 스택의 공간을 더 사용하지않습니까? push를 통한 것이니 esp(스택 포인터, 저는 x64라 rsp긴 합니다.)의 값도 감소(공간이 늘어난것) 하게 되는걸로 알고있습니다. 하지만 제 코드에선 컴파일러가 push를 통해 매개변수를 할당한것이아닌 esp+1h 라는 주소에 mov를 통해 직접 값을 넣었습니다. 제 생각에는 main에서 esp를 sub를 통해 확보한 스택프레임의 크기에 공간이 남아서 그 빈공간에 매개변수를 할당한것같은데 이건 그저 컴파일러가 판단해서 한게 맞는건지 궁금합니다.

 

int PrintNumber(int a,int b)

{

00007FF6506918D0 mov dword ptr [rsp+10h],edx

00007FF6506918D4 mov dword ptr [rsp+8],ecx

00007FF6506918D8 push rbp

00007FF6506918D9 push rdi

00007FF6506918DA sub rsp,108h

00007FF6506918E1 lea rbp,[rsp+20h]

00007FF6506918E6 lea rcx,[__0D5E813E_CPP_STUDY_8@cpp (07FF6506A3066h)]

00007FF6506918ED call __CheckForDebuggerJustMyCode (07FF6506913FCh)

00007FF6506918F2 nop

int c = a + b;

00007FF6506918F3 mov eax,dword ptr [b]

00007FF6506918F9 mov ecx,dword ptr [a]

00007FF6506918FF add ecx,eax

00007FF650691901 mov eax,ecx

00007FF650691903 mov dword ptr [c],eax

return c;

00007FF650691906 mov eax,dword ptr [c]

}

00007FF650691909 lea rsp,[rbp+0E8h]

00007FF650691910 pop rdi

00007FF650691911 pop rbp

00007FF650691912 ret

 

여기서 rsp+1h, rsp+8에 각각 eax,ebx에 들어있는 매개변수값을 mov를 통해 넣어주고 push를 통해 이전 스택프레임의(main함수) rbp rdi 값을 밀어넣어주고 rsp,108h 라는 공간을 printNumber의 함수의 스택프레임으로써 sub을 사용에 할당하고 여자저차 연산하고 이후 다시 lea rsp,[rbp+0E8h]를통해 rsp를 main함수의 레지스터가 저장된 스택 (위에서 rbp rdi값) 위치로 돌아가 pop을 해줌으로써 다시 rdi rbp의 값을 넣어주고 ret한다고 이해를 했습니다.

 

근데 이 rsp+1h , rsp+8은 사실 새로운 스택프레임 즉 printNumber의 스택프레임이 아닌 범위인데 ( main에서 잡아논 스택 공간) 이런건 컴파일러의 재량인지 궁금하고 또 위험한 기능은 아닌지 궁금합니다!.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

지혁김님께서 질문하신 스택 프레임과 관련하여 컴파일러가 매개변수를 할당하는 방식에 대한 의문을 해결하기 위해, 유사한 질문과 그에 대한 답변을 찾아드리겠습니다. 스택 프레임에 대한 이해와 컴파일러가 어떻게 함수의 매개변수를 처리하는지에 관한 질문으로 보아, 스택 프레임의 구조와 컴파일러가 생성하는 코드의 최적화 방식에 대한 설명이 포함된 정보가 도움이 될 것 같습니다.

다음은 컴파일러가 스택 프레임을 다루는 방식과 관련하여 유사한 질문에 대한 지식공유자의 답변입니다:

  • 스택 프레임에서 저장한 매개변수에 대해서: 이 글에서는 스택 프레임을 이용한 함수 호출 과정, 매개변수와 지역변수 저장 방식에 대해 논의됩니다. 특히, 함수로 전달된 매개변수가 어떻게 저장되고 처리되는지에 대한 내용이 포함되어 있어 질문에 도움이 될 수 있습니다. (스택프레임에서 저장한 매개변수에 대해서)

귀하의 질문에 대해 주어진 정보를 바탕으로 볼 때, 컴파일러가 함수의 매개변수를 스택에 할당하는 방식은 컴파일러의 최적화 정책과 실행 환경에 따라 달라질 수 있음을 알 수 있습니다. 특히 rsp 레지스터를 조작하는 방식과 mov 명령어를 사용해 매개변수를 직접 저장하는 방법은 해당 최적화 과정의 일부로 볼 수 있습니다. 이러한 방법이 “위험한 기능”으로 볼 수 있느냐의 문제는 컴파일러가 매우 정교하게 코드를 생성하고 있기 때문에 일반적으로는 문제가 되지 않으며, 개발자가 이러한 메커니즘을 이해하면 더 효율적인 프로그래밍이 가능해질 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

지혁김님의 프로필 이미지
지혁김

작성한 질문수

질문하기