[MASM x86]
------------------------------------------------------------------------------------------------------
명령어 push
push operand (레지스터, 상수)
1. esp = esp - 논리주소의 크기 (x86 = 4, x64 = 8)
2. PTR [esp]에 operand 값을 쓴다.
명령어 pop
pop operand (레지스터)
1. PTR [operand]의 값을 레지스터에 쓴다.
2. esp = esp + 논리주소의 크기 (x86 = 0x4, x64 = 0x8)
-------------------------------------------------------------------------------------------------------
esp에서 시스템 논리주소의 크기를 빼는 이유는 stack이 아래방향으로 자라기 때문이다.
예를 들어, x86 시스템에서 ESP = 0x0019FE28 EBP = 0x0019FE34 이라고 하면,
push ebp // 1. 0x0019FE24 (esp) = 0x0019FE28 (esp) - 0x4
2. 메모리[0x0019FE24]에 0x0019FE34를 쓴다.
mov ebp, esp // ebp = 0x0019FE24, esp = 0019FE24
pop ebp // 1. 메모리 [0x0019FE24] 값을 ebp에 쓴다.
2. 0x0019FE28 (esp) = 0019FE24 (esp) + 0x4
참고
IBM PC 어셈블러 프로그래밍, 이재광 & 전병찬
'프로그래밍 언어 > Assembly' 카테고리의 다른 글
명령어 mov, lea (0) | 2021.03.04 |
---|---|
Assembly - 범용 레지스터 (0) | 2021.01.17 |