함수는 어셈블리어에서 프로그램이 처리해야 할 명령어들을 한 덩어리로 모아 놓은 코드 블록이다.
C나 파이썬에서도 함수를 정의해 쓰는 것처럼,
어셈블리어에서도 라벨로 특정 구역을 표시하고 call 명령어 등을 활용해 함수를 사용할 수 있다.
함수는 **서브루틴(Subroutine), 프로시저(Procedure), 함수(Function)**라는 용어로 횬용된다.
=> 이번 강의에서는 편의상 함수라는 용어로 통일해서 사용한다.
함수를 호출한 함수(Caller)는 call 명령어로 함수를 불러서 사용하고, 호출된 함수(Callee)는 ret 명령어를 이용해서 다시 이전 함수에서 실행 중이던 코드로 돌아간다.
본 강의에서는 다음 내용을 다룰 것이다.
스택과 관련된 어셈블리어 명령어 학습하기
함수와 관련된 어셈블리어 명령어 학습하기
어셈블리어에서 함수가 선언 및 정의되는 과정 가볍게 살펴보기
함수가 호출되고 반환되는 과정을 어셈블리어 레벨에서 이해하기
x86 아키텍처의 스택은 높은 메모리 주소에서 낮은 메모리 주소로 자라는 특징이 있다.
스택은 데이터를 추가할 때마다 메모리 주소가 감소하며, 데이터를 제거하면 다시 증가하는 특성이 있다.
=> 데이터가 쌓일수록 rsp가(rsp의 메모리 주소) 낮아진다.
스택의 가장 중요한 요소는 스택 포인터(Stack Pointer) 레지스터인 rsp이다.