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 예제)






설정

트랙백

댓글