오늘까지 작성한 프로젝트
Download
Report
Transcript 오늘까지 작성한 프로젝트
발표일 : 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
neophilia16@naver.
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 명령어는 같은 레지스터들을 반대 순서로 팝 한다