본문 바로가기
프로그래밍/SYSTEM HACKING

[SYSTEM HACKING] NASM ( 문자, 문자열 ) / data, bss, text segment에서의 데이터 표현 / 레지스터( Register )

by B T Y 2017. 10. 17.
반응형

NASM ( 문자, 문자열 ) / data, bss, text segment에서의 데이터 표현 / 레지스터( Register )에 대해서 정리한다.




C 언어


  - 문자: '(작은 따옴표)

  - 문자열: "(큰 따옴표)


  - 'hello'(x), 'h'(o)

  - "hello"(o), "h"



NASM


  - 문자, 문자열: '(작은 따옴표)

    * 어셈블리어는 문자와 문자열을 구분하지 않는다.


  - 어셈블리어는 NULL 문자가 자동으로 붙지 않기 때문에 따로 붙여줘야 한다.

       * 이스케이프 문자가 지원되지 않는다면 ASCII 코드 값을 넣어주면 된다.




( nasm 홈페이지에 문서를 참조하면 String Constants 부분에 문자에 대한 표현 방법이 자세하게 나와있다 )



( C언어 같은 경우에는 NULL 문자가 자동으로 붙지만 

어셈블리어의 경우 위와 같이 00이나 이스케이프 문자를 통해서 NULL 문자를 따로 붙여줘야 한다 )








data segment에서 데이터 표현


  - 레이블: <white space> 크기 <white space> 초기값( 시퀀스 형태 )


  - 레이블은 변수 이름이 아니다!!!

  - 변수의 개념과는 다른 개념

  - 주소의 또 다른 표현


   * 각 컴파일러마다 진입점(entry point)가 정해져 있다.

     ( gcc의 경우 main,  어셈블리의 경우 _start)


   * data segment에서는 크기 앞에 d라는 접두어가 붙는다.



bss segment에서의 데이터 표현


  - 레이블: <white space> 단위 <white space> 크기


  - int a;

  - char str[1024];


    * bss segment에서는 접두어로 단위 앞에 res가 붙는다.



text segment에서 명령어 표현


    레이블:

명령어

명령어

...


    * 어셈블리에서 함수를 호출할때 인자는 뒤에서부터 역순으로 push를 이용해서 넣어준다.

       ( 예를들어서 printf("%s %s", 'hello', 'world!!!')라면 'world!!!' 인자부터 역순으로 push 해준다 )


    * push로 함수에 인자를 넣어준다음에 call을 이용해서 함수를 호출해서 사용한다.







[실습] 다음과 같이 출력하는 어셈블리 프로그램을 작성하세요.


    ( 0 )_( 0 ) ( 0 )_( 0 )

    (=^ . ^=) (*^ . ^*)

    ( _m_m_) (_m_m_)







기본 데이터의 단위( 32bit 기준 )


단위             크기 C 정의     NASM(문자)


byte             1         char             b

word             2         short             w

double word            4         int, long, float,      d

    pointer

quad word             8         long long, double     q

ten byte     10




CPU가 사용하는 데이터 저장소


  1. 메모리


  2. 레지스터


        -  CPU가 사용하는 고속의 기억 소자( 메모리와 비교해서 속도가 더 빠르다 )

        -  CPU내에 있는 공간

        - 특별한 용도를 위해서 사용하는 저장공간

        - CPU당 한개의 레지스터만 제공

        - 레지스터를 새로 생성, 수정, 삭제 등을 할 수 없다.


            * 어셈블리에서 위 두 공간을 제외하고는 데이터를 저장할 공간이 없다.

               ( 그렇기 때문에 어셈블리에서는 메모리, 레지스터를 이용한다 )


            * 레지스터와 어셈블리 명령어는 인텔 문서(vol1: 레지스터, vol2:명령어)를 참조한다.

intel-architecture-vol1.pdf

intel-architecture-vol2.pdf


            * 하드웨어가 바뀌면 어셈블리 명령어 또한 바뀐다.

              ( 현재 실습 환경은 intel 기준이고 만약 안드로이드에서 사용하는 암이라는 하드웨어를 사용하면 또 달라진다 )



      1). 범용 레지스터


          - EAX ( Extended Accumulator Register )

          - EBX ( Extended Base           Register)

          - ECX ( Extended Count   Register)

          - EDX ( Extended Data           Register)


            * 범용 레지스터는 원래 목적 이외에도 다양하게 쓰인다.



      2). 포인터 레지스터


         - ESI ( Extended  Source      Index )

         - EDI ( Extended  Dst          Index )

         - ESP ( Extended Stack        Pointer )

         - EBP ( Extended Base         Pointer )

         - EIP ( Extended  Instruction Pointer )



     3). 상태 레지스터


         - ELFLAGS



    4). 세그먼트 레지스터





반응형

댓글