오늘까지 작성한 프로젝트

Report
발표일 : 2013년 5월 5일
팀장 :박태영 / 팀원 : 조정민, 이지영, 이숭운, 권승현
박태영
구 분
성
팀장
팀원
명
핸 드 폰
이메일
비
고
박태영
010-6250-5242
[email protected]
m
5.4
조정민
010-3648-8055
[email protected]
5.1,5.2
이지영
010-9596-4948
[email protected]
om
5.3
이숭운
010-8831-7520
[email protected]
m
5.5
권승현
010-9580-8639
[email protected]
com
5.6
박태영
 10개의 접시를 쌓아 놓을 때에 만들어진 것을 스택 이라 함
 접시가 쌓인 스택의 중간에서 접시를 빼내는 것은 가능할 수 있으나,
맨 위에서부터 빼내는 것이 훨씬 더 일반적임
 새로운 접시는 스택의 맨 위에 추가할 수 있지만, 스택의 바닥이나,
중간에 추가할 수는 없음
박태영
 다음 그림과 같이 10개의 숫자를 쌓아 놓을 때에 만들어진 것을 스택
(stack)이라고 말할 수 있다.
10
9
8
7
6
5
4
3
2
1
TOP
bottom
새로운 값은 스택의 맨 위에 추가되고 스택의 기존 값은 맨 위부터 제거됨
스택에 마지막으로 넣은 값이 항상 맨 먼저 꺼내는 값이기 때문에
스택은 LIFO(Last-In First-Out) 구조라고도 부른다.
 실행시간 스택 : 스택 포인터 레지스터라고 하는 ESP레지스
터를 사용함
 ESP 레지스터 : 스택에 있는 어떤 위치에 대한 32비트 오프셋
을 저장함
 ESP: 항상 스택의 맨 위에 추가된 마지막 저수를 가리킴
 ESP : 직접 조작하는 일은 거의 없으며
CALL,RET,PUSH,POP과 같은 명령어를 사용하여 간접적으로
수정함
박태영
Offset
000001000
00000006
ESP = 00001000h
00000FFC
00000FF8
00000FF4
00000FF0
 각 스택의 위치는 32비트를 저장함
이것은 프로그램이 32비트 모드에서 수행되고 있는 경우임
16비트 실제 주소 모드에서 SP(Stack Point)레지스터가 가장 최근에
푸쉬 된 값을 가리키며 스택 엔트리들은 대개 16비트 길이임
• 32비트 push 연산은 스택 포인터를 4씩 감소시키고 값을
스택 포인터가 가리키는 스택 위치로 복사함
• 16비트일 경우에는 스택 포인터가 2씩 감소함
• ESP 레지스터는 항상 스택의 맨 위를 가리킴
• 실행시간 스택은 메모리에서 높은 주소부터 낮은 주소로
아래 방향으로 커짐
박태영

스택에 정수를 push 하기
BEFORE
000001000
AFTER
00000006
ESP
ESP
00000FFC
00000006
000001000
000000A5
00000FFC
00000FFC
00000FF8
00000FF4
00000FF4
00000FF0
00000FF0
00000001과 00000002를 push 한 후의 스택
Offset
000001000
00000006
00000FFC
000000A5
00000FF8
00000001
00000FF4
00000002
00000FF0
ESP
• ESP가 가리키는 스택 원소의 내용을 16비트 또는 32비트
목적지 피연산자로 복사하고 다음에 ESP를 증가시킨다
• 피 연산자가 16비트이면 ESP는 2씩 증가한다
• 피 연산자가 32비트이면 ESP는 4씩 증가한다
박태영
 Pop 연산
BEFORE
000001000
00000FFC
AFTER
00000006
00000006
000001000
000000A5
000000A5
00000FFC
00000001
00000FFC
00000FF8
00000001
00000FF4
00000002
ESP
00000FF4
ESP
00000FF0
00000FF0

Pop연산은 스택에서 팝된 후에 스택 포인터는
스택의 그 다음 높은 주소를 가리키도록 (스택 원소 크기
만큼) 증가됨
 ESP 아래의 스택 영역은 논리적으로 빈 상태(logically empty)이며
현재의 프로그램이 스택에 값을 푸쉬하는 명령어를 수행할 때 덮어
쓰임
• 프로그램에서 실행시간 스택의 몇 가지 중요한 용도는 다음과 같다
• 스택은 레지스터가 한 가지 이상의 목적으로 사용될 때에 레지스터를
위한 간편한 임시 저장 영역으로 사용된다. 레지스터가 수정된 뒤에
원래의 값으로 복원될 수 있다.
• CALL 명령어를 수행할 때에 CPU는 현재 서브루틴의 복귀 주소를 스
택에 저장한다.
• 서브루틴을 호출할 때에 인수(argument)라고 하는 입력 값을 스택에
푸쉬하여 전달한다.
• 스택은 서브루틴 내의 지역 변수를 위한 임시 저장 공간을 제공한다.
박태영
PUSHFD와 POPFD명령어
(PUSH Flags Double) (POP Flags Double)
PUSHFD 명령어는 32비트 EFLAGS 레지스터를 스택에 푸쉬한다
POPDF 명령어는 스택을 EFLAGS로 팝 한다
32비트 피연산자는 ESP를 4씩 감소시킨다
16비트 프로그램은 16비트 FLAGS 레지스터를 스택에 푸쉬하기 위해서
PUSHF 명령어를 사용하고
FLAGS로 팝 하기 위해서 POPF를 사용한다.
박태영
 PUSHAD, PUSHA, POPAD, POPA 명령어
PUSHAD 명령어는 모든 32비트 범용 레지스터를 EAX, ECX, EDX, EBX,
ESP (PUSHAD를 실행하기 이전 값), EBP,ESI,EDI의 순서로 푸쉬한다
80286에서 도입된 PUSHA 명령어는 16비트 범용 레지스터들(AX,CX,DX,
BX,SP,BP,SI,DI)을 나열된 순서대로 스택에 푸쉬 한다
POPAD 명령어는 같은 레지스터들을 반대 순서로 스택에서 팝 한다
POPA 명령어는 같은 레지스터들을 반대 순서로 팝 한다

similar documents