1. Compile이란?
- 우리가 짠 소스코드를 컴퓨터가 이해 할 수 있는 기계어로 바꾸는 과정, gcc -o [만들어줄 파일이름] [컴파일할 파일 이름]으로 컴파일 해줄 수 있다.
- 프로그래밍 언어->어셈블리어->기계어의 순서를 거친다
1.1 전처리(Pre-processor)
- 컴파일을 시도할 경우 먼저 전처리기의 과정을 거친다 해당 헤더파일의 디렉토리를 찾아서 삽입해 준다 #define 이 있을 경우 이를 치환해 준다.
- gcc -E -o [만들어줄 파일이름.i] [컴파일할 파일이름] 으로 해 줄 수 있다.
1.2 컴파일러(Compiler)
- 우리가 작성한 소스코드를 읽어서 연산자,괄호,식별자와 같은 문법 요소별로 잘라서 이 문법 요소들을 해석해서 구문 트리를 생성해 주고, 이 트리로부터 어셈블리어 코드를 만들어 준다.
1.3 어셈블러(Assembler)
- 우리가 만들어 준 어셈블리어 코드를 컴퓨터가 이해 할 수 있는 기계어코드로 바꾸어 준다.
1.4 링커(Linker)
- 컴파일러가 만들어 준 코드들을 연결해서 하나의 실행 파일로 합쳐준다
- gcc -c [컴파일 해줄 파일이름]으로 확인 해 줄 수 있다
Static 컴파일 | Dynamic 컴파일 |
- 오브젝트 파일들이 하나의 파일로 묶여있는 라이브러리에 서 해당되는 오브젝트 파일이 바이너리와 링크되어 하나하 나 삽입되는 형태 - 속도는 빠르나 같은 오브젝트 파일들이 중복되어 파일의 크기가 커진다 gcc -static 옵션으로 사용할 수 있다 |
- 일반적인 형태의 컴파일 - 오브젝트 파일들이 하나하나 링크되는 것이 아니라, 사용한 다는 표시만 해 둔다 - 프로세스를 하나라도 사용하면 메모리에 로딩되고 이를 계 속해서 공유한다 - Static 컴파일 보다 용량을 줄일 수 있다 |
2. 파일권한
- -ls-al 로 파일권한들을 확인 할 수 있다.
- 파일 권한 명령어
chmmod | 파일의 권한을 변경해 준다 | chmod [옵션] [8진수 권한][파일명] Ex) chmod 744: 유저는 모든 권한, 그 룹과 게스트는 읽기권한만 가지고 있다. |
chown | 디렉토리 파일의 소유자를 변경해 준다 | chown [사용하는 사람]:[바꿔줄 대상] |
3. 레지스터
- CPU 내부에 존재하고 있는 공간->데이터 처리가 빠르게 가능하다
4. 어셈블리
- 소스 코드를 컴파일 할 때 바로 기계어로 바꾸는 것이 아닌 직관적인 기호코드로 바꾼 것
- 기계어와 1대1로 대응된다
- Assembly 명령어
push | 오퍼랜드의 값을 스택에 쌓아 준다 Ex) push %eax: eax 의 값을 스택에 쌓아 준다 |
pop | 스택의 마지막 값을 뽑아서 오퍼랜드에 저장해 준다 Ex) pop %eax: 스택의 마지막 값을 eax 에 저장해 준다 |
mov | 오퍼랜드 안의 값을 복사해서 붙여 넣어준다 Ex) mov %eax,%ebx : ebx 의 값을 eax로 복사해서 붙여넣어 준다 |
lea | 주소값을 저장해 준다 Ex) lea (%esi), %ecx : esi 의 주소값을 ecx 에 저장해 준다 |
lnc | 값을 1 더해서 저장해 준다 Ex) lnc %eax : eax 의 값을 1증가시켜서 eax 에 저장해 준다 |
dec | 값을 1 빼서 저장해 준다 Ex) dec %eax: eax 의 값을 1빼서 eax에 저장해 준다 |
add | 값을 덧셈해 준다 Ex) add %eax,%ebx: eax 에 ebx 의 값을 더해서 저장해 준다 |
sub | 값을 빼 준다 Ex) sub %eax,: eax 에 ebx 의 값을 빼서 저장해 준다 |
call | 특정 함수를 호출해 준다 되돌아 올 주소를 저장하기 때문에 함수를 호출해 준 후 원래 위치로 되돌아 올 수 있다 Ex) call 함수주소 :함수의 시작 주소로 이동한다 |
ret | 스택에 저장되어있는 주소로 이동한다 Ex) ret: 함수를 호출했던 곳으로 이동해 준다 |
cmp | 두 가지 값을 비교해 준다 값이 같다면 결과는 0이 된다 Ex) cmp: %eax 5 : eax 에서 ebx 를 빼서 값을 비교한다 |
jmp | 실행 흐름이 가리키는 코드로 이동한다 Ex) jmp %eax : eax 에 저장된 주소로 이동한다 |
nop | 아무 일도 하지 않는다 |
4.1 어셈블리 지정방식
- 1. 즉시 지정방식: 주소의 내용을 꺼내지 않고 직접 값을 대응시킨다.
→ mov $0x01,%eax: eax 에 16진수 1의 값을 넣는다
- 레지스터 지정방식: 레지스터에서 레지스터로 직접 값을 대응시킨다
→ mov %eax,%ebx : ebx에 eax 의 값을 넣는다
- 직접 주소 지정방식: 메모리의 주소를 지정해서 그 값을 저장해 주는 방식이다
→ mov %eax, $0x80482f2 : 0x80482f2의 주소에있는 값을 eax 에 넣어준다.
- 레지스터 간접 주소 지정방식: 괄호 내의 값의 주소를 레지스터에 저장해 준다
→ mov (%ebx),%eax: ebx의 값의 주소를 eax에 넣어준다.
- 베이스 상대 주소 지정방식: 괄호 안의 주소에서 특정 바이트를 더한 주소의 값을 저장해 준다. 보통 레지스터의 크기는 4byte 이다
→ mov 0x4(%esi),%eax: esi 의 주소에서 4byte를 더한 주소의 값(레지스터 다음 주소)를 eax 에 넣어준다
'Study > Basic Study' 카테고리의 다른 글
Linux Study - Gdb, 함수 프롤로그/에필로그 (0) | 2021.06.27 |
---|---|
Linux Study - 리눅스 쉘, 구조, 메모리 구조 (0) | 2021.05.04 |