[gpg2권 박민근] 1.13 스택 와인딩
TRANSCRIPT
스택 와인딩 (Stack Winding)
GPG 2. Section 1. General Programming 1.13
DevRookie Study, 2011. 8. 6. 박민근
처음 이 챕터를 읽었을때의 감상 ..
스택 와인딩
일반적인 의미 :
함수가 호출될때 , 호출한 함수의 호출 주소 및 로컬 변수등의 정보가 스택에 저장된다 .
이것을 ‘스택와인딩’이라고 한다 .
스택 와인딩
GPG 에서의 의미 :
이렇게 스택 와인딩을 통해서 저장된 정보를 조작하여 , 일반적으로는 불가능한 기법들을 수행하는 특수한 기법( 사실 쓰는걸 본적도 , 들은적도 없다… )
스택 언와인딩 (Unwding)
스택에 쌓인 지역 변수 및 함수들을 역으로 호출하면서 , 해제하는것을 ‘스택언와인딩’이라고 한다 .
이건 도대체 어디에 쓸까 ?
스택 언와인딩 (Unwding) try
{ if(! 수행할 코드 ) throw …}catch(...){ 예외가 발생했을 경우 수행할 코드}
throw 가 발생하는 경우 ,return 이 없어도 기존에 스택에 쌓인 함수들을 역순으로 호출하면서 , 지역 변수등을 자동으로 해제한다 .
이것이 ‘스택 언와인딩’이다 .
간단한 TempRet
① fn0(), fn1() 호출
② 이 함수를 호출한 곳의 다음 주소를 스택에서
가져온다
③ 가져온 주소를 실행한다 = 호출자의 다음
부분을 진행 한다 .
④ 실행이 다 끝나면 이 함수의 다음 부분을
진행한다 .
⑤ fn2(), fn3() 호출
간단한 TempRet 즉 ,
하나의 함수 안에서… 실행 중에 바깥 ( 호출자 ) 의 코드를 실행하고 난 후에 , 다시 함수 안으로 돌아와서 뒷 부분을 실행할 수 있다 !
헐 ~~~
TempRet 연쇄
① 각 함수들은 TempRet 앞까지만
호출 된다 .
② 35 줄의 jmp 로 게임이 실행된다 .
③ 게임이 종료되면 , 스택 언와인딩이
된다
④ 각 함수의 TempRet 뒷부분들이
역순으로 호출된다 .
썽킹 (Thunking) 앞 부분의 코드를 C++ 에서
인라인 어셈블러로 구현한 것
재귀 호출 ( 응용 )
① 재귀 함수를 호출하기 전에 호출자
( 바깥 함수 ) 의 주소를 저장해둔다 .
② 재귀 함수 내부에서 조건이 만족되
면 , 저장한 주소를 호출하여 바로
끝내버린다 .
※ 재귀 호출한 함수들을 거슬러
올라오는 부하를 없앨 수 있다 .
재귀 호출 ( 응용 )