- 컴퓨터 구조(Computer Architecture)
- 명령어 집합 구조(Instruction Set Architecture, ISA)
- 범용 레지스터(General Register)
- 세그먼트 레지스터(Segment Register)
- 플래그 레지스터(Flag Register)
- 명령어 포인터 레지스터(Instruction Pointer Register, IP)
컴퓨터 구조의 세부 분야
> 폰 노이만 구조
중앙처리장치 (연산, 제어) / 기억장치 (저장)/ 버스 (전자통로)
CPU - 두뇌/ 산술논리장치, 제어장치, 레지스터로 구성
기억장치 - 주기억장치(램), 보조기억장치(하드드라이브,SSD)
버스 - 데이터 버스, 주소 버스, 제어버스, 프로토콜
명령어 집합 구조(Instruction Set Architecture, ISA)
x86-64 아키텍쳐
n비트 아키텍쳐
CPU가 이해할 수 있는 데이터의 단위라는 의미 - word
x86-64 아키텍쳐: 레지스터
범용 레지스터(General Register)
세그먼트 레지스터(Segment Register)
- x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재/ 크기는 16비트
명령어 포인터 레지스터(Instruction Pointer Register, IP)
- CPU가 어느 부분의 코드를 실행할지 가리킴, x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트
플래그 레지스터(Flag Register)
- RFLAGS는 64비트이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 20여개 정도만 사용
요약정리
- 범용 레지스터(General Register): 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.
- 세그먼트 레지스터(Segment Register): 과거에는 메모리 세그멘테이션이나, 가용 메모리 공간의 확장을 위해 사용됐으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터. x64에는 cs, ss, ds, es, fs, gs가 있다.
- 플래그 레지스터(Flag Register): CPU의 상태를 저장하는 레지스터
- 명령어 포인터 레지스터(Instruction Pointer Register, IP): CPU가 실행해야할 코드를 가리키는 레지스터. x64에서는 rip가 있다.
퀴즈
- 세그먼트란
- 코드 세그먼트
- 데이터 세그먼트
- BSS 세그먼트
- 스택 세그먼트
- 힙 세그먼트
세그먼트(Segment)
세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것.
코드 세그먼트(Code Segment)는 실행 가능한 기계 코드가 위치하는 영역으로 = 텍스트 세그먼트(Text Segment)
데이터 세그먼트(Data Segment)에는 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치
- 쓰기가 불가능한 세그먼트에는 프로그램이 실행되면서 값이 변하면 안되는 데이터들 - rodata(read-only data) 세그먼트
BSS 세그먼트(BSS Segment, Block Started By Symbol Segment) - 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역
스택 세그먼트(Stack Segment)는 프로세스의 스택이 위치하는 영역
- 함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장
힙 세그먼트(Heap Segment)
- 실행중에 동적으로 할당될 수 있으며, 리눅스에서는 스택 세그먼트와 반대 방향으로 자람.
퀴즈
읽기 전용 데이터 (rodata)
BSS
코드
스텍
데이터
x64 어셈블리 언어
명령어
피연산자
- 상수, 레지스터, 메모리
요약정리
- 데이터 이동 연산자
- mov dst, src: src의 값을 dst에 대입
- lea dst, src: src의 유효 주소를 dst에 대입
- 산술 연산
- add dst, src: src의 값을 dst에 더함
- sub dst, src: src의 값을 dst에서 뺌
- inc op: op의 값을 1 더함
- dec op: op의 값을 1 뺌
- 논리 연산
- and dst, src: dst와 src가 모두 1이면 1, 아니면 0
- or dst, src: dst와 src중 한 쪽이라도 1이면 1, 아니면 0
- xor dst, src: dst와 src가 다르면 1, 같으면 0
- not op: op의 비트를 모두 반전
- 비교
- cmp op1, op2: op1에서 op2를 빼고 플래그를 설정
- test op1, op2: op1과 op2에 AND 연산을 하고, 플래그를 설정
- 분기
- jmp addr: addr로 rip 이동
- je addr: 직전 비교에서 두 피연산자의 값이 같을 경우 addr로 rip 이동
- jg addr: 직전 비교에서 두 피연산자 중 전자의 값이 더 클 경우 addr로 rip 이동
요약정리 2
- 스택
- push val: rsp를 8만큼 빼고, 스택의 최상단에 val을 쌓습니다.
- pop reg: 스택 최상단의 값을 reg에 넣고, rsp를 8만큼 더합니다.
- 프로시저
- call addr: addr의 프로시저를 호출합니다.
- leave: 스택 프레임을 정리합니다.
- ret: 호출자의 실행 흐름으로 돌아갑니다.
- 시스템 콜
- syscall: 커널에게 필요한 동작을 요청합니다.