markdown 스택프레임
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 스택프레임相关的知识,希望对你有一定的参考价值。
# 개요
프로그램에서 함수가 함수를 호출하여 수행이 될 때 아래의 그림과 같이 겹치거나 걸쳐지는 것이 아닌
중첩되어 실행이 된다. 중첩되어 실행되는 함수는 가장 최근에 호출된 함수가 가장 먼저 수행을 종료
하고 자신을 호출한 함수로 복귀하게 된다.
![stackframe01](http://www.tipssoft.com/data/cheditor4/1501/c9df1e0cbf27c9ac473a9a49bcafb16b_s6hpUdRMg.png)
위의 그림을 예로 들면 FuncA()함수를 수행 중에 FuncB() 함수를 호출하게 된다. 이때 FuncA()함수는
자신이 어떤 함수를 어느 위치에서 수행하였는지 알지만, FuncB() 함수는 자신이 어느 함수에게 호출이
되었는지 어느 지점으로 돌아가야 하는지 알지 못한다.
따라서 함수는 후입선출(LIFO) 구조인 스택 안에 고유한 자신만의 영역을 가지게 되는데 이것을 스택
프레임(Stack Frame)이라고 한다.
여기에서 FuncA()함수의 스택 프레임에는 FuncB() 함수가 호출될 당시의 FuncA() 함수의 수행환경과
호출한 위치 등을 스택 프레임에 저장(Push)하고 매개 인자가 있는 경우에는 매개 인자를 넘겨 준 후
FuncB() 함수를 수행하게 된다.
복귀할 때에는 FuncA() 함수의 스택 프레임에 저장된 정보들을 빼내어(Pop) FuncB() 함수 수행 전의
수행환경을 조성한 후 남은 FuncA() 함수의 작업을 수행한다.
# 스택프레임 예제
## C언어로 작성된 예제
```cpp
void Swap(int *parm_a, int *parm_b)
{
int temp = 0;
// temp 변수를 이용하여 parm_a와 parm_b의 포인터 값을 바꾼다.
temp = *parm_a;
*parm_a = *parm_b;
*parm_b = temp;
}
void main()
{
int a = 5, b = 7;
// 변수 a와 b의 값을 바꾼다.
Swap(&a, &b);
}
```
## 어셈블리어로 변환된 예제
```asm
6: void Swap(int *parm_a, int *parm_b)
7: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-44h]
0040102C mov ecx,11h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
8: int temp = 0;
00401038 mov dword ptr [ebp-4],0
9:
10: temp = *parm_a;
0040103F mov eax,dword ptr [ebp+8]
00401042 mov ecx,dword ptr [eax]
00401044 mov dword ptr [ebp-4],ecx
11: *parm_a = *parm_b;
00401047 mov edx,dword ptr [ebp+8]
0040104A mov eax,dword ptr [ebp+0Ch]
0040104D mov ecx,dword ptr [eax]
0040104F mov dword ptr [edx],ecx
12: *parm_b = temp;
00401051 mov edx,dword ptr [ebp+0Ch]
00401054 mov eax,dword ptr [ebp-4]
00401057 mov dword ptr [edx],eax
13: }
00401059 pop edi
0040105A pop esi
0040105B pop ebx
0040105C mov esp,ebp
0040105E pop ebp
0040105F ret
15: void main()
16: {
00401070 push ebp
00401071 mov ebp,esp
00401073 sub esp,48h
00401076 push ebx
00401077 push esi
00401078 push edi
00401079 lea edi,[ebp-48h]
0040107C mov ecx,12h
00401081 mov eax,0CCCCCCCCh
00401086 rep stos dword ptr [edi]
17: int a = 5, b = 7;
00401088 mov dword ptr [ebp-4],5
0040108F mov dword ptr [ebp-8],7
18: Swap(&a, &b);
00401096 lea eax,[ebp-8]
00401099 push eax
0040109A lea ecx,[ebp-4]
0040109D push ecx
0040109E call @ILT+0(Swap) (00401005)
004010A3 add esp,8
19: }
004010A6 pop edi
004010A7 pop esi
004010A8 pop ebx
004010A9 add esp,48h
004010AC cmp ebp,esp
004010AE call __chkesp (004010d0)
004010B3 mov esp,ebp
004010B5 pop ebp
004010B6 ret
```
以上是关于markdown 스택프레임的主要内容,如果未能解决你的问题,请参考以下文章
python [已弃用]코레일승차권검색및프프로그램.https://github.com/devxoul/korail
swift 패스트캠퍼스iOS프로젝트캠프 - 교재에없는Swift예시
scss [CSS] Image Grayscale(이미지그레이스케일로변환)