성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • ARM Reverse Engineering
  • 문자열 나누기
  • MFC
  • Boot Code 분석
  • WINAPI

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.09.10_ASM_push_instructions, pop_instructions
Assembly

2013.09.10_ASM_push_instructions, pop_instructions

2013. 9. 10. 17:37


 push Instructions , pop Instructions

 ▶ push 명령어

 : 메모리 구성의 stack 영역에 직접 값을 집어 넣어주는 명령어

  push eax

 1. esp = esp-4;

 2. eax = *esp


 .386    

.MODEL FLAT  

ExitProcess 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
    'Assembly' 카테고리의 다른 글
    • 2013.09.11_스택영역을 확인해보자_스크랩
    • 2013.09.11_CODE Stack 영역 알아보기_수정중
    • 2013.09.04_jmp_instruction
    • 2013.09.02_ASM_Convering Instruction
    성엽이
    성엽이

    티스토리툴바