본문 바로가기

Assembly

8-1강 - Advanced Procedures 1 (Stack Frames)

현대 프로그래밍 언어들은 subroutine, local variable을 stack의 형태로 저장한다.

 

1. Stack Frames (Stack Parameters)

기존에는 register를 parameter로 사용했다. 

이번 단원에서는 runtime stack에서 parameter를 받는다.

원래 window 함수들은 register parameter와 stack parameter를 받는다.

 

1) Stack Frame

1> ESP가 아닌 EBP를 사용해서 stack 내부의 local variable, parameter, return address에 접근하는 기법

2> EBP는 기준점으로 stack에 고정되어 있어서 base pointer의 역할을 한다. (ESP는 프로그램 안에서 수시로 변경된다.)

3> Stack Frame 사용 형식

 

2) stack frame의 예시

1> Passing by value

2> Passing by reference

아예 주소를 stack에 올릴 수 있다.

3> Passing Arrays

array도 stack에 올릴 수 있다.

3) Stack Parameter

1> 접근 방법

EBP가 stack의 top임을 이용해서 stack의 원소들에 접근한다.

2> cleaning stack

add esp, 4*(지워야할 주소의 개수)

 

4) Local Variable

지역 변수들은 runtime stack에서 생성(저장)된다.

1> sub esp, 8 : local variable을 만들기 위한 작업

2> mov esp, ebp : stack에서 local variable을 제거

 

 

5) 32-bit calling convention

 

6) LEA 

MOV와 비슷한 원리이다.

(MOV는 값을 대입했다면) LEA는 address를 대입

1> 예시

30개의 element를 가지는 array를 만든다.

그래서 지역 변수 30개를 확보하기 위해 esp는 32를 뺀다.

2> 예시 2

OFFSET을 이동시키려면 MOV가 아닌 LEA를 사용해야한다.

7) ENTER

1> 형식 및 활용

ENTER numbytes, nestinglevel

=> stack frame을 자동으로 생성하고 지역 변수에 대한 공간을 numbytes만큼 확보

(nestinglevel은 호출하는 procedure의 stack frame으로부터 현재의 stack frame으로 복사되는 stack frame pointer 수를 결정)

- PUSH ebp

- MOV ebp, esp

- sub esp, numbytes : 지역 변수에 대한 공간을 numbytes만큼 확보

 

8) LEAVE

procedure에 대한 stack frame을 종료시킨다.

1> 활용

LEAVE

=> ENTER 명령어의 동작을 반대로 수행한다. (지역 변수를 위한 공간을 해체한다.)

- MOV esp, ebp

- POP ebp

2> 예시

9) LOCAL (directive)

하나 이상의 local variable을 이름으로 선언하며 local variable에 크기 속성을 부여한다.

1> 형식 및 활용

LOCAL label:type

2> 예시 1

- LOCAL var1:BYTE : BYTE형 local variable var1을 stack frame에 포함한다.

- LOCAL var1:BYTE, valword:WORD : 2개의 local variable (var1, valword)를 stack frame에 포함한다.

3> 예시 2