20140801 (Assembly push, pop, pushad, popad, pushfd, popfd)
115일차
-------------
Assembly
-------------
------- Stack 영역
ESP Reg가 Stack영역의 주소를 갖고 있다.
Stack 영역은 높은 주소에서 낮은 주소로 움직인다.
------- push Instruction
stack 영역에 값을 넣는 명령어
push [저장할 값]
- push 100
이 명령어가 실행되는 과정.
1. ESP = ESP - 4;
2. *ESP = 100;
예제)
Stack은 메모리 영역이기에 little endian이라서
값이 거꾸로 들어간다.
차례대로 들어갔다.
(0x0012FFC0 인지 주소를 어떻게 알았냐면은
ESP에 값을 확인하면 된다.)
1 byte로는 들어가지 않고 4 byte로 들어간다.
부호에 맞게 남는 값이 채워져 들어갔다.
2 byte는 2 byte씩 들어간다.
2 byte가 들어가고 4 byte가 이어서 계속 들어가고
2 byte가 들어갔다.
C 컴파일어 같은 경우는
4 byte씩 끊어 넣기 때문에
줄줄 이어지지 않는 반면
어셈블리는 그대로 이어서 준다.
------- pop Instruction
Stack 영역에 값을 빼오는 명령
pop [저장할 곳]
- pop eax
이 명령어가 실행되는 과정.
1. eax = *ESP;
2. ESP = ESP + 4;
------- pushad, popad
--- pushad
Reg 값 저장
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
순으로 저장.
--- popad
Reg 값 불러오기
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 중에
ESP만 제외하고 다 불러온다.
pusha
=> push 16bit reg
pushad
=> push 32bit reg
popa
=> pop 16bit reg
popad
=> pop 32bit reg
--- pushad 예제)
--- popad 예제)
------- pushfd , popfd
flags 값을 저장한다.
- pushfd 예제)
a96인데 b96으로 저장된다.
TF flag가 켜지고 저장이된다.
- popfd 예제)