ㅇ 레지스터 : CPU내에 있는 기억장소
ㄴ ESP(Stack Pointer) : 현재 스택의 위치가 어디인지 갖고 있음
ㄴ EIP(Instruction Pointer) : CPU가 실행될 명령어가 어디 있는지 해당 주소를 갖고 있음 (다음번 실행할 명령어의 위치)
ㄴ EBP(Base Pointer) : 각 함수프레임의 기준 위치 (함수 호출이 끝나면 해당 위치로 리셋해줘야 함)
ㄴ EAX~EDX : 산술, 논리 연산의 결과값을 임시로 보관하는 레지스터
EAX : 함수 리턴값 저장
ㄴ ESI, EDI : 반복, 문자열
ㄴ 상태 레지스터 : 비교, 점프, 반복
ㅇ 함수프레임, 프롤로그, 에필로그
프롤로그 : 함수가 호출되었을 때 RET, SFP 영역을 만드는 작업
에필로그 : 함수 실행 완료 시 함수가 할당된 스택 영역을 빈 영역으로 반납하는 작업
ㅇ 프롤로그
ㄴ push ebp //함수가 호출되지 않아서 함수 프레임이 없는 경우 SFP의 값을 받아와서 푸쉬함
à 이전 함수의 위치를 기억하지 않으면 에필로그에 의해 복귀되었을 때 기준위치를 알 수 없음
ㄴ mov esp, ebp (AT&T) //EBP의 값을 ESP로 바꿔주어야 하는데, EBP에 현재 위치가 ESP에 있으므로 ESP의 값을 EBP로 넣음
à main 함수쪽에 있던 기준위치 EBP를 myfunc함수 ESP로 바꾸겠다는 의미
ㅇ 에필로그
- leave
> mov ebp, esp (AT&T) //ebp값을 esp로 넣음
pop ebp //현재 esp에 있는 값을 꺼내와서 ebp에 셋팅함
à 현재 EBP의 값은 아직 소멸되지 않은 myfunc의 기준위치인 SFP로 설정이 되어있고, 그 값을 SFP(myfunc)에 들어가 있는 값으로 바꿔치기 하겠다는 의미
à myfunc의 SFP에는 이전함수의 기준위치가 들어가 있음
à … 따라서 pop ebp로 myfunc의 SFP가 없어지고, 그 공간에 들어가있던 값인 main의 기준위치인 SFP로 EBP 값이 바뀌게 된다.
***pop은 값을 꺼내오는 명령어임
- ret
> pop eip //꺼내올 값인 myfunc의 RET를 eip에 넣음
à RET(myfunc)에는 main의 return 0;을 실행할 값을 갖고 있음