본문 바로가기

교육/ASSEM

[어셈블리어] ESP와 push와 pop명령어 + pushad, popad

ESP 레지스터
  • STACK의 시작'주소'를 가지고 있다. (32bit의 stack point)











push 명령어
  • Operand를 1개 가진다.


push 100 의 명령을 수행 할 때는
  1. ESP = ESP - 4
  2. * ESP = 100
이렇게 두가지의 수행을 하게된다.
















push명령 debug로 실행하는 화면


ESP가 가지고있는 현재 주소는 0012ffc4

push     0ffffffffh 명령을 수행 한 후

1. ESP = ESP - 4 의 주소인 12ffc0을 가지고
2. 그 주소에 ffff ffff의 메모리를 넣는다.


push     012345678h 명령을 수행 한 후

1. ESP = ESP -4 의 주소인 12ffbc
2. 그 주소에 12345678의 메모리를 넣는데 리틀엔디안 방식으로 넣어진걸 확인할 수 있음.


...
...



나머지도 같은 방식으로 실행됨





-----------------
추가





push 명령에 WORD ptr을 넣었을 경우 4byte가 아닌 2byte단위로 주소안의 값이 채워진다.



그리고 WODR와 WODR사이의 메모리는 빈틈없이 꽉꽉채워짐.



이런 형태





STACK의 Operand를 확인하면 BYTE단위는 없다는 것을 확인 할 수 있다.
적어도 2byte이상은 사용하여야함







pop 명령어
  • pop destination
  • push의 반대명령, 주소안에 있는 값을 지정한 Operand로 넣는다.

  1. eax = *esp
  2. esp = esp + 4


마지막에 저장된 cd 00 의 값을 얻기위해서 ax를 Operand로 줘서 값을 eax에서 확인함




이런식으로 pop 명령을 주면 위에 push로 집어넣었던 값들이 전부 지정한 Operand로 전달된다.








  • 기본적이로 push나 pop은 EBP가 가르키는 곳 즉 메모리에 접근하기 때문에 속도가 느리다.
  • - 레지스터의 수가 적기때문에 씀



pushad 명령어
  • 레지스터에 저장된 메모리를 한번에 불러들일 수 있다.
  • pushad명령을 하면 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 의 순서대로 저장된다.
  • ESP는 제일 처음의 stack주소값을 지니고 있다.


pushad명령을 수행한 후  EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 의 순서대로 값이 저장됨을 확인 할 수 있다.



pusha - push all
pushad - push all dword




popad 명령어
  • pushad와 반대되는 명령
  • 주소안에 있는 값들을 한꺼번에 레지스터로 불러올 수 있다.
  • pushad와는 다르게 ESP가 가지는 주소를 stack의 첫번째 주소로 되돌려주지 않는다.




EFL레지스터에 저장하는 방법 pushfd
EFL레지스터에 불러오는 방법 popfd