Story of CowHacker

어셈블리 chapter 1 본문

공부/어셈블리@_@

어셈블리 chapter 1

Cow_Hacker 2020. 6. 1. 17:44
728x90

어셈블리의 기본지식에 대해 작성 할것이다.

 

1. Stack & Heap

 

    1) Stack 이란 함수 호출시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. ( LIFO 구조 )

   

Stack

    2) Heap 이란 필요에 의해 동적으로 메모리를 할당할 때 사용하는 영역이다.

       ( 스택과는 반대 방향으로 데이터가 쌓인다. )

Heap

 

 

2. 레지스터

 

    1) 레지스터란 컴퓨터의 프로세서가 자료를 보관하는 아주 빠른 기억 장소이다. 

                               -> 프로세서 : 컴퓨터 내에서 프로그램을 수행하는 녀석이다.

    2) 레지스터 종류

       - 산술 레지스터 : 덧셈의 덧수, 곱셉의 곱수, 비교 또는 자리가 이동될 단어 등을 보유한 레지스터 

                              ex)  eax, ebx, ecx, edx ...

 

       - 범용 레지스터 : 특별한 용도 없이 임의로 사용 가능한 레지스터

                              ex) eax, ebx, ecx, edx

                                  > ( 일반 적으로 eax는 누산기, ebx는 인덱스, ecx는 카운터, edx는 데이터 용도로 쓰인다. )

 

       - 주소 레지스터 ( 포인터 ) 

                 > 스택 포인터 : esp

                 > 베이스 포인터 : ebp

                 > 명령 포인터 : eip

 

       - 인덱스 레지스터 

                 > esi : 시작지 인덱스 

                 > edi : 목적지 인덱스

 

       - 상태 레지스터 ( 플래그 레지스터 )

                 > ZF ( 제로 플래그 ) : 연산 결과가 0일 경우에 참이 된다.

                 > CF ( 캐리 플래그 ) : 캐리 플래그 부호 없는 숫자의 연산 결과가 비트 범위를 넘어섰을 때 참이 된다.

                 > AF ( 보조 캐리 플래그 ) : 연산 결과 하위 니블 ( 4bit ) 에서 비트 범위를 넘어섰을 때 참이 된다.

                 > V / O / W ( 오버플로 플래그 ) : 부호 있는 숫자의 연산 결과가 비트 범위를 넘어섰을때 참이 된다.

                 > N / S ( 네거티브 플래그, 사인 플래그 ) : 연산 결과가 음수일 때 참이 된다.

                 > I / E ( 인터럽트 플래그 ) : 이 플래그가 참일 경우에만 인터럽트 요구를 받아들인다.

                 > PF ( 패리티 플래그 ) : 연산 결과에서 1로된 비트의 수가 짝수일 경우 참이 된다.

                 > DF ( 디렉션 플래그 ) : 문자열 조작에서 참일 경우 주소 레지스터 값이 자동으로 감소하고, 거짓일 경우                                                    자동으로 증가한다.

                 > D / T ( 디버그 플래그, 트랩 플래그 ) : 참일 경우 한 명령이 실행할 때마다 인터럽트가 발생한다.

       

 

3. 어셈블리 명렁어

 

    - MOV : 데이터 이동

                ex) mov eax, ebx; -> ebx레지스터를 eax로 옮긴다.

    - LEA :  주소 이동

                ex) lea eax, ebx; -> ebx의 주소를 eax에 넣는다. 

      

    - PUSH : 스택의 데이터를 쌓는다.

                ex) push eax; -> eax 레지스터의 값을 스택에 넣고 esp는 4byte 올라간 값을 가르키게된다.

                     push 20; -> 20을 스택에 집어 넣는다.

                     push 40203F; -> 40203F 값을 그대로 스택에 넣는다.

 

    - POP : 스택의 데이터를 뺀다.

               ex) pop eax; -> esp가 가리키고 있는 값이 eax에 저장되고 esp는 4byte 내려간 값을 가리키게 된다.

    

    - ADD : 값을 더한다.

               ex) add eax, 7; -> eax에 7을 더한다.

 

    - SUB : 값을 뺸다.

               ex) sub eax, 7 -> eax에 7을 뺀다.

 

    - INC : 1을 더한다.

              ex) inc eax; -> eax에서 1을 더한다.

 

    - DEC : 1을 뺀다.

              ex) dec eax; -> eax에서 1을 뺀다.

 

    - NOP : 인자를 받지 않는다.

 

    - CALL : 변경전 eip값을 스택에 저장후 함수를 호출한다.

 

    - RET : call을 통해 호출된 함수에서 다시 복귀할때 사용한다.

 

    - JMP : 변경전 eip값을 저장하지 않고 바로 함수를 호출한다.

 

      JMP 함수 종류

명령어 의미 부등호 플래그 조건
JA jump if (unsigned) above > CF = 0 and ZF = 0
JAE jump if (unsigned) above or eual >= CF = 0 or ZF = 1
JB jump if (unsigned) below < CF = 1
JBE jump if (unsigned) below or equal <= CF = 1 or ZF = 1
JC jump if carry flag set   CF = 1
JCXZ jump if CX is 0   CX = 0
JE jump if equal == ZF = 1
JECXZ jump if ECX is 0   ECX = 0
JG jump if (signed) greater > ZF = 0 and SF == OF
JZ jump if zero == ZF = 1

 

    - CMP : 비교를 한다.

    

728x90

'공부 > 어셈블리@_@' 카테고리의 다른 글

어셈블리 chapter 2  (0) 2020.06.05
Comments