프롤로그/에필로그 코드를 작성할 때 고려 사항Considerations When Writing Prolog/Epilog Code

Microsoft 전용Microsoft Specific

자신의 prolog 및 epilog 코드 시퀀스를 작성하기 전에 스택 프레임을 배치하는 방법을 이해하는 것이 중요합니다. __LOCAL_SIZE의 미리 정의된 상수를 사용하는 방법을 알아두는 것도 좋습니다.Before writing your own prolog and epilog code sequences, it is important to understand how the stack frame is laid out. It is also useful to know how to use the __LOCAL_SIZE predefined constant.

C 스택 프레임 레이아웃C Stack Frame Layout

이 예제에서는 32비트 함수에 표시될 수 있는 표준 prolog 코드를 보여 줍니다.This example shows the standard prolog code that might appear in a 32-bit function:

push     ebp                 ; Save ebp  
mov      ebp, esp            ; Set stack frame pointer  
sub      esp, localbytes     ; Allocate space for locals  
push     <registers>         ; Save registers  

localbytes 변수는 지역 변수를 위한 스택에 필요한 바이트 수를 나타내고, registers 변수는 스택에 저장될 레지스터의 목록을 나타내는 자리 표시자입니다.The localbytes variable represents the number of bytes needed on the stack for local variables, and the registers variable is a placeholder that represents the list of registers to be saved on the stack. 레지스터를 푸시한 후 스택에 다른 적절한 데이터를 배치할 수 있습니다.After pushing the registers, you can place any other appropriate data on the stack. 다음은 해당 epilog 코드입니다.The following is the corresponding epilog code:

pop      <registers>         ; Restore registers  
mov      esp, ebp            ; Restore stack pointer  
pop      ebp                 ; Restore ebp  
ret                          ; Return from function  

스택은 항상 높은 메모리 주소에서 낮은 메모리 주소로 감소합니다.The stack always grows down (from high to low memory addresses). 기본 포인터(ebp)는 ebp의 푸시된 값을 가리킵니다.The base pointer (ebp) points to the pushed value of ebp. 지역 변수 영역은 ebp-2에서 시작됩니다.The local variables area begins at ebp-2. 지역 변수에 액세스하려면 ebp에서 적절한 값을 빼는 방법으로 ebp에서 오프셋을 계산합니다.To access local variables, calculate an offset from ebp by subtracting the appropriate value from ebp.

__LOCAL_SIZE 상수The __LOCAL_SIZE Constant

컴파일러는 함수 prolog 코드의 인라인 어셈블러 블록에서 사용할 __LOCAL_SIZE 상수를 제공합니다.The compiler provides a constant, __LOCAL_SIZE, for use in the inline assembler block of function prolog code. 이 상수는 사용자 지정 prolog 코드의 스택 프레임에 대한 지역 변수의 공간을 할당하는 데 사용됩니다.This constant is used to allocate space for local variables on the stack frame in custom prolog code.

컴파일러는 __LOCAL_SIZE의 값을 결정합니다.The compiler determines the value of __LOCAL_SIZE. 값은 모든 사용자 정의 지역 변수 및 컴파일러 생성 임시 변수의 총 바이트 수입니다.The value is the total number of bytes of all user-defined local variables and compiler-generated temporary variables. __LOCAL_SIZE는 즉시 피연산자로만 사용할 수 있으며 식에서는 사용할 수 없습니다.__LOCAL_SIZE can be used only as an immediate operand; it cannot be used in an expression. 이 상수의 값을 변경하거나 다시 정의해서는 안 됩니다.You must not change or redefine the value of this constant. 예:For example:

mov      eax, __LOCAL_SIZE           ;Immediate operand--Okay  
mov      eax, [ebp - __LOCAL_SIZE]   ;Error  

다음 예제에서는 사용자 지정 prolog 및 epilog 시퀀스를 포함하는 다음 naked 함수가 prolog 시퀀스에서 __LOCAL_SIZE를 사용한다는 방식을 보여 줍니다.The following example of a naked function containing custom prolog and epilog sequences uses __LOCAL_SIZE in the prolog sequence:

__declspec ( naked ) func()  
{  
   int i;  
   int j;  

   __asm      /* prolog */  
      {  
      push   ebp  
      mov      ebp, esp  
      sub      esp, __LOCAL_SIZE  
      }  

   /* Function body */  

   __asm      /* epilog */  
      {  
      mov      esp, ebp  
      pop      ebp  
      ret  
      }  
}     

Microsoft 전용 종료END Microsoft Specific

참고 항목See Also

Naked 함수Naked Functions