다음을 통해 공유


프롤로그/에필로그 코드 작성의 고려 사항

Microsoft 전용

자신의 프롤로그 및 에필로그 코드 시퀀스를 쓰기 전에 스택 프레임의 레이아웃이입니다 이해 하는 것이 중요 합니다.유용 하 게 사용 하는 방법을 알아야 되는 __LOCAL_SIZE 기호.

스택 프레임 레이아웃

이 예제에서는 표준 프롤로그 코드를 나타나지 않을 수 있습니다 32 비트 함수를 보여 줍니다.

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

localbytes 변수를 지역 변수를 스택에 필요한 바이트 수를 나타냅니다 및 <registers> 변수를 스택에 저장 하는 레지스터의 목록을 나타내는 자리 표시자입니다.레지스터를 밀어 후 스택에 다른 적절 한 데이터를 배치할 수 있습니다.해당 하는 에필로그 코드는 다음과 같습니다.

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

스택 (에서 낮은 메모리 주소 높은)를 항상 증가합니다.기본 포인터 (ebp) 푸시된 값을 가리키는 ebp.지역 변수 영역에서 시작 ebp-4.로컬 변수에 액세스할 수에서 오프셋을 계산 합니다. ebp 통해에서 적절 한 값을 뺀 ebp.

__LOCAL_SIZE

컴파일러가 기호를 제공 __LOCAL_SIZE, 인라인 어셈블러 함수 프롤로그 코드 블록에서 사용 합니다.이 기호를 사용 하 여 사용자 지정 프롤로그 코드에서 스택 프레임에서 지역 변수에 대 한 공간을 할당 합니다.

컴파일러가 값 결정 __LOCAL_SIZE.해당 값의 바이트의 모든 사용자 정의 지역 변수 및 임시 변수를 컴파일러에서 생성 된 총입니다.__LOCAL_SIZE 가 직접 피연산자와;만 사용할 수 있습니다 식에 사용할 수 없습니다.없습니다 변경 하거나이 기호 값을 다시 정의 해야 합니다.예를 들면 다음과 같습니다.

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

다음 예제에서는 사용자 지정 프롤로그 및 에필로그를 포함 하는 naked 함수를 사용 하 여 시퀀스의 __LOCAL_SIZE 기호 프롤로그 시퀀스에서:

// the__local_size_symbol.cpp
// processor: x86
__declspec ( naked ) int main() {
   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
      }
}

참고 항목

참조

Naked 함수 호출