#include <iostream>
int multiplyBy(int x, int y)
{
int result = x * y;
return result
}
int main()
{
int x = 3;
int y = 5;
int result = multiplyBy(x, y);
std::cout<< result << std::endl;
return 0;
}
WINDOWS, MAC, Linux와 같은 운영체제(OS)가 프로그램을 실행할 때 code area, stack area, heap area 등과 같은 메모리 공간을 할당해 준다.
Stack 이라는 영역은 함수에서 사용하는 메모리 영역이고, 함수 호출할때마다 일련의 함수 정보들을 스택에 쌓는데 이를 스택 프레임이라고 한다.
함수를 호출하기전에 매개변수 y, x 와 이후에 실행 될 반환 주소 값을 push 하는 모습이 보인다.
함수가 호출되는 어셈 코드가 시작된 후 메모리 상태이며 주소의 값에 매개변수 값 3과 5가 저장되어 있고, 다음으로 함수 호출이 끝난 후 진행되어야 할 코드의 주소 값이 정상적으로 입력되는 것을 볼 수 있다.
함수 작업을 수행하기 위한 선작업을 진행하는데, 3번째 라인 sub esp, 0C0h 구문이 함수의 스택 영역을 지정한다.
p.s 즉 OS에서 부여한 스택 영역이 부족하게 된다면 stack overflow 간드아...
eax(누산기 레지스터)에 x값을 대입하고, eax 값과 y의 값을 곱셈한다. 곱셈 결과는 eax에 저장되는데, 해당 결과를 result 지역 변수에 값을 대입하고 리턴 구문에서 eax 레지스터에 또 지역 변수의 값을 대입하는 것이 보인다.
지역변수 result에 eax값을 대입하고 eax에 다시 result 값을 대입하는 부분이 불필요 해보여서 x * y 결과값을 바로 리턴해보았다.
어셈 코드가 한줄 줄어든 것을 볼 수 있었다. 미세 최적화라고 볼 수 있겠지만, 경험상 디버깅을 위해서, 가독성을 위해서 지역변수를 활용하는게 더 좋을것 같다.