외로운 Nova의 작업실

Assembly 언어 공부 - 29(ENTER과 LEAVE 명령어, LOCAL 명령어) 본문

Programming/Assembly

Assembly 언어 공부 - 29(ENTER과 LEAVE 명령어, LOCAL 명령어)

Nova_ 2022. 10. 2. 11:40

안녕하세요, 이번시간에는 프로시저에서 사용할 수 있는 ENTER과 LEAVE 명령어 또, 지역변수를 만들어주는 LOCAL 명령어에 대해서 알아보겠습니다.

 

- ENTER 명령어와 LEAVE 명령어

우리는 항상 스택을 사용하는 프로시저를 만들면 아래와 같은 코드를 사용하곤 했습니다.

push ebp
mov ebp, esp
sub esp, numbytes		//지역변수 공간 확보

위 3가지를 한번에 써주는 명령어가 ENTER 명령어 입니다. ENTER 명령어는 피연산자 2개가 있습니다. 하나는 지역변수 공간 확보를 위한 버이트수를 지정하는 상수이고, 다른 하나는 구문 중첩 수준 지정을 위한 상수입니다. 구문 중첩 수준 지정을 위한 상수는 항상 0으로 두면 됩니다. 그렇다면 예제를 하나 보도록 하겠습니다. 

plus PROC
	enter 8, 0

위 코드는 MASM 컴파일러에 의해서 아래와 같은 코드로 변경됩니다.

plus PROC
    push ebp
    mov ebp, esp
    sub esp, 8

지역변수를 위한 공간을 할당했다면, ret을 하기전에 없애줘야겠죠? 즉 esp를 ebp값으로 변경해줘야합니다. 이를 수동으로 해도되지만 LEAVE 명령어를 사용하면 자동으로 해줍니다. 바로 예제를 보시죠.

plus PROC
    enter 8, 0
    leave
    ret
plus ENDP

위와 같은 코드는 MASM에 의해 아래와 같은 코드로 변경됩니다.

plus PROC
    push ebp
    mov ebp, esp
    sub esp, 8
    mov esp, ebp
    pop ebp
    ret
plus ENDP

5줄의 명령어를 2줄로 사용이 가능해서 코딩할때 편리하게 사용할 수 있습니다.

 

- LOCAL 명령어

지역 변수를 만들때에는 공간 확보와 변수의 이름이 선언되어야합니다. 이를 위해 LOCAL 명령어가 탄생했습니다. 바로 예제를 보시죠.

plus PROC
    LOCAL val1:DWORD
    ret
plus ENDP

위 코드는 DWORD 크기를 갖는 val1 지역 변수를 생성해줍니다. 위 코드는 MASM에 의해 아래와 같은 코드로 변경됩니다.

plus PROC
     push ebp
     mov ebp, esp
     add esp, 0FFFFFFFCh
     mov esp, ebp
     ret
plus ENDP

LOCAL 명령어의 작동방식은 항상 DWORD 크기로 진행이 됩니다. 만약 지역 변수의 크기가 BYTE, WORD 라도 4바이트의 공간 확보후 상위 바이트에 WORD인 2바이트를 저장합니다. 예제를 한번 봐보겠습니다.

plus PROC
    LOCAL val1:WORD, val2:DWORD, val3:BYTE
    ret
plus ENDP

 

위 코드를 실행하게된다면, 아래 그림과 같이 스택이 구성됩니다.

LOCAL 명령어

항상 지역변수를 사용할때에는 적절한 STACK의 크기를 구성해주어야합니다. 만약 지역변수를 10000 바이트 사용해야한다면, STACK의 크기를 10000 바이트보다 더 크게 생성해줘야합니다. 또한, 항상 EBP 값이 push되기때문에 이또한 고려해야합니다. 이것으로 LOCAL 명령어 설명을 마치도록 하겠습니다.

Comments