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예시

c_cpp 스레드개념

scss [CSS] Image Grayscale(이미지그레이스케일로변환)

markdown 私人네임네임맹#python #tutorial

markdown 터미널프롬프트변경