실행가능한 기계 코드가 위치하는 영역
ex) main()등의 함수코드
컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들의 위치
※ data 세그먼트 : 쓰기 가능, 전역 변수와 같은 프로그램이 실행되면서 값이 변할 수 있는 데이터 위치
※ rodata 세그먼트 : 쓰기 불가, 전역 상수와 같은 값이 변하면 안되는 데이터 위치
컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리, 프로그램이 시작될 때 모두 0으로 값이 초기화 됨.
ex) 초기화되지 않은 전역 변수
실행중에 동적으로 할당되며, 스택 세그먼트와 반대로 자람.
ex) malloc(), calloc() 등으로 할당 받은 메모리
함수의 인자나 지역 변수와 같은 임시변수들이 실행 중에 저장, 스택 프레임(함수 호출 때 생성, 반환 때 해제)이라는 단위로 사용, 작은 크기의 스택 세그먼트를 먼저 할당 후 확장함, 스택이 확장 시 기존 주소보다 낮은 주소로 확장됨
ex) 지역 변수, 함수의 인자
: 컴퓨터가 효율적으로 작동하도록 하드웨어 및 소프트웨어 기능을 고안하고 구성하는 방법
1) 중앙처리장치(CPU) : 프로그램 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌. 산술논리장치-제어장치-레지스터 로 구성
2) 기억장치 : 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용, 프로그램 실행과정에서 필요한 데이터를 임시로 저장하는 주기억장치(ex. RAM)과 운영체제와 같은 데이터를 장기간 보관하고 할 때 사용하는 보조기억장치(ex. HDD, SSD)로 구성
3) 버스 : 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로. 데이터가 이동하는 데이터 버스, 주소를 지정하는 주소버스, 읽기/쓰기를 제어하는 제어버스 있음.
주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터
cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터 존재
각 레지스터 크기 = 16비트
cs, ds, ss 레지스터 : 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용
일련의 기계의 코드들 중에 CPU가 어느 부분의 코드를 실행할지 가리키는 역할
프로세서의 현재 상태 저장, 자신을 구성하는 여러 비트들로 CPU의 현재상태 표현
어셈블러 : 개발자들이 어셈블리어로 코드를 작성하면 컴퓨터가 이해할 수 있는 기계어로 코드 치환함.
역어셈블러 : 기계어 -> 어셈블리 언어로 번역
데이터 이동(Data Transfer) : mov, lea
mov rdi, rsi : rsi의 값을 rdi에 대입
mov QWORD PTR[rdi], rsi : rsi의 값을 rdi가 가리키는 주소에 대입
lea rsi, [rbx+8*rcx] : [rbx+8*rcx]자체를 rsi에 대입
산술 연산(Arithmetic) : inc, dec, add, sub
add dst, src : dst에 src의 값을 더함
sub dst, src : dst에서 src의 값을 뺌
inc op : op의 값을 1 증가시킴
dec op : op의 값을 1 감소시킴
논리 연산(Logical) : and, or, xor, not
and dst, src : dst와 src의 비트가 모두 1이면 1, 아니면 0
or dst, src : dst와 src의 비트 중 하나라도 1이면 1, 아니면 0
xor dst, src : dst와 src의 비트가 서로 다르면 1, 같으면 0(xor을 동일한 값으로 두 번 실행시, 원래값으로 돌아감)
not op : op의 비트 전부 반전
비교(Comparison) : cmp, test
cmp op1, op2 : 두 피연산자를 빼서 대소비교
test op1, op2 : 두 피연산자에 AND 비트연산을 취함
분기(Branch) : jmp, je, jg
jmp addr : addr로 rip을 이동시킴
je addr : 직전에 비교한 두 피연산자가 같으면 점프
jg addr : 직전에 비교한 두 연산자 중 전자가 더 크면 점프
스택(Stack) : push, pop
push val : val을 스택 최상단으로 쌓음
pop reg : 스택 최상단의 값을 꺼내서 reg에 대입
프로시져(Procedure) : 특정 기능을 수행하는 코드 조각, call, ret, leave
call addr : addr에 위치한 프로시져 호출
leave: 스택프레임 정리
ret : return address로 변환
시스템 콜(System call) : 유저모드에서 커널모드의 시스템 소프트웨어에게 어떤 동작을 요청하기 위해 사용, syscall
syscall : 요청: rax
인자 순서: rdi → rsi → rdx → rcx → r8 → r9 → stack
커널모드 : 운영체제가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한
유저모드 : 운영체제가 사용자에게 부여하는 권한