더북(TheBook)

예를 들어 지역 변수 b에 접근할 때는 ebp + 12를 하면 변수 b의 주소 값을 얻을 수 있습니다. 어셈블리 코드를 보면 우선 ebp 값을 스택에 저장하는데, 이 ebp 값은 main 스택 프레임의 프레임 포인터 값입니다. 함수 호출이 끝난 다음 다시 main 스택 프레임의 기준을 가리켜야 하므로 스택에 저장해 둡니다. 그다음 행을 보면 스택 포인터 값을 프레임 포인터에 대입함으로써 프레임 포인터가 adder 스택 프레임의 기준이 되게 합니다.

sub A, BA에서 B를 빼서 다시 A에 저장하는 명령어입니다. 어셈블리 코드를 보면 스택 포인터가 esp에서 일정 메모리를 빼서 나머지 지역 변수의 공간을 확보하는데, 이때 뺄셈을 하는 걸 알 수 있습니다.

199_2

그림 9-8 스택 프레임 할당 ④


왜 뺄셈을 하는 걸까요? 스택의 위쪽은 낮은 주소고 아래쪽은 높은 주소입니다(그림 9-2). 또한 스택은 위쪽으로 확장합니다. 즉, 스택에 데이터를 쌓는다는 것은 스택 포인터가 가리키는 주소가 점점 더 낮아진다는 것을 의미합니다. 스택 포인터가 낮은 주소를 가리키려면 뺄셈을 하면 됩니다. 지역 변수의 메모리를 확보하려면 필요한 공간만큼 esp에서 빼면 되는 것이지요. 그림 9-8까지가 스택 프레임이 할당되는 과정입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.