카테고리 없음

9/12 스터디 라이트 업

tree frog 2024. 9. 15. 21:11
  • 컴퓨터 구조(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 어셈블리 언어

명령어

 

피연산자

- 상수, 레지스터, 메모리

 

요약정리

  1. 데이터 이동 연산자
    • mov dst, src: src의 값을 dst에 대입
    • lea dst, src: src의 유효 주소를 dst에 대입
  2. 산술 연산
    • add dst, src: src의 값을 dst에 더함
    • sub dst, src: src의 값을 dst에서 뺌
    • inc op: op의 값을 1 더함
    • dec op: op의 값을 1 뺌
  3. 논리 연산
    • 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의 비트를 모두 반전
  4. 비교
    • cmp op1, op2: op1에서 op2를 빼고 플래그를 설정
    • test op1, op2: op1과 op2에 AND 연산을 하고, 플래그를 설정
  5. 분기
    • jmp addr: addr로 rip 이동
    • je addr: 직전 비교에서 두 피연산자의 값이 같을 경우 addr로 rip 이동
    • jg addr: 직전 비교에서 두 피연산자 중 전자의 값이 더 클 경우 addr로 rip 이동

요약정리 2

  1. 스택
    • push val: rsp를 8만큼 빼고, 스택의 최상단에 val을 쌓습니다.
    • pop reg: 스택 최상단의 값을 reg에 넣고, rsp를 8만큼 더합니다.
  2. 프로시저
    • call addr: addr의 프로시저를 호출합니다.
    • leave: 스택 프레임을 정리합니다.
    • ret: 호출자의 실행 흐름으로 돌아갑니다.
  3. 시스템 콜
    • syscall: 커널에게 필요한 동작을 요청합니다.