push Instructions , pop Instructions |
▶ push 명령어 : 메모리 구성의 stack 영역에 직접 값을 집어 넣어주는 명령어 push eax 1. esp = esp-4; 2. eax = *esp .386 .MODEL FLATExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD .STACK 4096 .DATA .CODE _smart: mov eax , 0aaaaaaaah mov ebx , 0bbbbbbbbh mov ecx , 0cccccccch mov edx , 0ddddddddh push eax push bx push 0cch push 0ddh INVOKE ExitProcess, 0 PUBLIC _smart END ▶ 설명 : 처음위치 0x12FFC4 eax 만큼 (4byte만큼) 주소가 이동 했으므로 0x12FFC0 에 aa aa aa aa 값이 저장된다. bx 만큼 (2byte만큼) 주소가 이동 했으므로 0x12FFBE 2byte 만큼 이동하여 00 00 bb bb 가 저장된다. 하지만, 0cch (1byte) 를 넣으면 1byte 만큼 주소가 이동하지 않고 주소 자체가 (ESP : 0x12FFBA) 4byte 만큼 이동하여 00 00 cc 00 으로 저장된다. (push 명령어는 1byte register, memory 를 지원해 주지 않는다.immediate byte 만 지원)
▶ 결론적으로 효율적인 사용으로는 사용중인 Bus 의 크기만큼 사용하는 것이 속도면에서 더 효율적일 것이다.
▶ ESP 0012ffc0 ▶ ESP 0012ffbe ▶ ESP 0012ffba ▶ ESP 0012ffb6 ▶ pop 명령어 : 메모리 구성의 stack 영역에서 값을 뽑아내는 명령어 pop eax 1. eax = *esp 2. esp = esp + 4; ( ※ segment register 에서 CS 는 지원하지 않는다.) ▶ 메모리에는 little Endian 으로 저장이 되고, 레지스터에는 big Endian 로 저장이 된다. ※ little Endian ( 작은 주소 값이 끝에 값을 가리킴 > 66 55 44 33 22 11 > : 66 을 가리키는 자리가 제일 작은 주소 자리인데, 마지막 값을 가리킴), big Endian ( 큰 주소 값이 끝에 값을 가리킴 > 11 22 33 44 55 66 > : 위와 반대)
▶ Push all and pop all instructions : 레지스터의 값을 한번에 메모리에 집어 넣을때 사용, push 로 일일이 집어 넣는 것이 더 주기적으로 빠르지만, 이런 방법도 있다. : 메모리에 저장이 될때에는 미리 레지스터 만큼을 확보 한다음에 순서대로 메모리에 집어 넣는다. ( reg > mem )
▶ pushf and popf instructions : Flag 에 직접 입력이 가능하다 ( reg > flag ) |
'Assembly' 카테고리의 다른 글
2013.09.11_스택영역을 확인해보자_스크랩 (0) | 2013.09.12 |
---|---|
2013.09.11_CODE Stack 영역 알아보기_수정중 (0) | 2013.09.12 |
2013.09.04_jmp_instruction (0) | 2013.09.04 |
2013.09.02_ASM_Convering Instruction (0) | 2013.09.02 |
2013.08.29_Division Instructions (0) | 2013.08.29 |