일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 시나공
- python
- 알고리즘
- 코딩교육봉사
- 데이터베이스
- 백준 알고리즘
- 코딩봉사
- 백준
- CJ UNIT
- 회고
- 코틀린
- 문제풀이
- BFS
- 자바
- 소프티어
- 프로그래머스
- 파이썬
- programmers
- java
- softeer
- SW봉사
- C++
- MYSQL
- 공부일지
- 정보처리산업기사
- 1과목
- SQL
- 백준알고리즘
- 스프링
- kotlin
- Today
- Total
JIE0025
[Assembly] 함수 호출(call)과 메모리 반환(return) 개념 본문
함수 호출과 메모리 반환
어셈블리 언어에서 어떻게 이루어지는지 알아보자.
다음은 설명을 위한 가정이다.
- 함수 B에서 함수 A를 호출하는 상황이다.
- 함수 A는 매개변수로 int b, int c, int d를 갖고 있으며, 반환형은 int형이다.
1. CALL
함수 A를 호출 하면 다음과 같은 세가지 단계를 거친다.
1) push : 매개변수 저장
push를 통해 a라는 함수의 인자로 들어갈 값을 저장한다.
함수 a의 매개변수는 총 3개 이므로 push를 세번 반복할 것이다.
함수 호출시 가장 먼저 하므로 스택의 밑부분에 위치한다.
2) call : 호출한 명령어의 주소 저장
EIP(instuction Pointer)로 다음 명령어 주소값에다가 현재 우리가 함수를 호출했던 주소를 저장해줌으로서
return 이후 다음 명령어를 자연스럽게 읽을 수 있도록 한다.
3) push ebp : 호출한 함수의 ebp저장
mov ebp esp : esp의 값을 ebp에 저장시, 함수 a(호출받은 함수)의 ebp를 설정
우리는 의문을 가질 수 있다.
<< 함수를 호출한 후에 함수를 전부 읽었을 때 return해야 하는데 어디로 돌아와야하는가. >>
호출한 함수 (B)의 ebp를 push함으로서 return했을 때 ebp를 다시 재 설정 함으로서 B함수의 스택영역으로 돌아 올 수 있다. 즉, 리턴할때를 위해 저장한다는 것이다.
esp 를 ebp에 저장하는 것은 가장 최근의 pointer가 최상단에 존재할테니 호출된 함수 A의 ebp로 설정하기 위함이다.
ebp까지 설정이 끝난 후에 스택의 윗부분은 함수 a의 지역변수 공간이 된다.
2. RETURN
return은 call을 이해하였다면 비교적 간단하다.
함수 A에서 반환 하면 다음과 같은 세가지 단계를 거친다.
1) mov esp ebp : ebp의 값을 esp에 저장
이를 통해 가장 상단의 포인터가 a의 ebp로 설정이 되면서 함수 A의 Stack Frame을 없애는 꼴이 된다.
2) pop ebp
E stack에 저장되어 있던 B의 ebp를 ebp로 설정해주어야 현재 실행중인 함수가 사용하는 stack frame의 바닥을 b의 것으로 설정 할 수 있다. pop을 통하여 값을 재설정 하는 것이다.
3) retn
return 시 저장되어 있던 eip값으로 eip를 재설정 함으로서 원래 실행중이었던 줄로 이동한다.
'기타 학습 > Language' 카테고리의 다른 글
[BOJ - 자료구조] 1927 번 : 최소 힙 ( C++) (0) | 2022.05.06 |
---|---|
[C++] string::find, string::npos 단어 존재 여부 확인 (1) | 2022.05.05 |
[Python] 파이참에서 API 사용하기 : Twilio API를 이용한 문자 메시지 전송 실습 (0) | 2020.04.17 |
[Assembly] 기초 어셈블리명령어와 레지스터, Pointer Register, Push, Pop, Call, Retn, Mov (3) | 2020.03.18 |
Java Script 객체지향 텍스트RPG 실습과 기능 추가 (0) | 2020.01.28 |