[2] 어셈블리 문자열 표현방식 / 데이터단위 / 레지스터 종류

2017. 10. 16. 21:41SystemHacking/Assembly





NASM 이라는 어셈블러를 사용하도록 하겠습니다

NASM 에서는 한 개의 문자나 문자열 모두 ' ' 로 표현합니다

또한 문자와 문자를 , 를 사용해서 연결합니다

1> 'abcd' = 'ab' , 'cd'


2> 'Hello, World!!!' , 10 , 00

10과 00 은 무엇일까?

아스키 코드 10 => New Line ( Enter )

아스키 코드 00 => NULL ( 문자열의 끝을 알림 )



* 어셈블러 기본 데이터의 단위

단위             크기            C                       NASM(문자로표현)

byte                1            char                           b

word               2            short                          w

double word    4       int,long, float(32bit기준)          d

                              pointer(32bit기준)

quad word      8       long long, double               q

ten byte         10    



* 어셈블러는 이전 게시글에서 확인했던 섹션마다 데이터 표현 방법이 다릅니다

섹션별로 데이터 표현 방법에 대해 알아보도록 하겠습니다



[1] data section 에서 데이터를 표현하는 방법 

( data section : 초기값을 가지는 변수를 저장하는 섹션 )

[레이블]: <white space> [크기] <white space> [문자열or숫자의 초기값]

msg:    db    'Hello, World!!!',10,00

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

-> 변수의 개념과는 다르다. 주소의 또 다른 표현으로 볼 수 있다

=> data 섹션의 msg레이블(=주소)에 문자열을 위치시킨다!!!

( 레이블은 0x08080808 과 같은 주소를 이름을 붙인 것 )



 section .data                          ; initialized data section  data섹션영역임을 선언

 msg1:    db    '%s %s', 10, 00          ; char msg1[]="%s %s\n"; 

 buffer:    dd    1,2,3,4,5;                   ; int buffer[] = {1,2,3,4,5};

 


앞에 d를 사용해서 data섹션의 단위임을 표시함



[2] bss section 에서 데이터를 표현하는 방법

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

예시) #vi example.asm

 section .bss

 a: resd 1         ; int a

 str: resb 1024     ; char str[1024]

 

문자열 -> b
숫자 -> d

초기화하지 않고 크기만을 예약한다

 


[3] text section 에서 데이터를 표현하는 방법


text section 에서는 레지스터와 메모리 라는 개념을 사용하게 된다

해당 개념에 대해서만 알고 다음 글에서 설명하도록 하겠습니다

 

[ 레지스터 종류 ]


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

1.메모리

2.레지스터

CPU가 사용하는 고속의 기억 소자

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

CPU당 1개의 레지스터만을 제공한다

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


1-1> General-Purpose Registers ( 범용 레지스터 )


- EAX (Extented Acummulator) : Accumulator for operands and results data , 주로 산술연산시 사용 

EAX(32bit) - AX(16bit) - AH,AL(각각 8bit)

- EBX (Base) : Pointer to data in the DS segment , EAX보조 역할

EBX - BX -BH,BL

- EDX (Data) : I/O pointer , EAX 보조 역할

- ECX (Counter) : Counter for string and loop operations , 명령어 반복 처리시 반복횟수저장


1-2> 포인터 레지스터 특정 주소를 가리킨다 )

- ESI ( Extented Source Index ) : 문자열 복사시 주로사용 ( ECX와 함께 )

- EDI ( Destination Index ) : 문자열 복사시 주로사용 ( ECX와 함께 )

- EBP ( Base Pointer ) : Stack 섹션에서 주로 사용

- ESP ( Stack Pointer ) : Stack 섹션에서 주로 사용

- EIP ( Instruction Pointer ) : 다음 실행할 명령어의 주소가 들어간다


1-3> 상태 레지스터

EFLAGS : 상태정보를 나타낸다 32비트로 구성

SF 부호가 발생한 경우

ZF 연산결과가 0

CF 올림수


1-4> 세그먼트 레지스터물리메모리 가상메모리 매핑시 사용