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 기준이고 만약 안드로이드에서 사용하는 암이라는 하드웨어를 사용하면 또 달라진다 )
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). 세그먼트 레지스터
댓글