CS:APP 3장 – 기계 수준 프로그램 표현 (중요 개념 정리)

2025. 4. 9. 22:45개념 공부

 3.3 데이터 형식 (Data Formats)

  • x86-64 기준으로 데이터 타입 크기 정리
타입 크기 (바이트)
char 1
short 2
int 4
long, char* 8
float 4
double 8

메모리에 저장할 때는 데이터 크기만큼의 공간이 할당되며, 정렬(alignment)에 주의해야 함.

3.4 정보 접근하기 (Accessing Information)

피연산자 종류

  • Immediate: 즉시값, 예: $0x10
  • Register: 레지스터, 예: %rax
  • Memory: 간접 참조, 예: 8(%rbp), (%rax,%rdx,4)

 데이터 이동 명령어 (mov)

movq $0x10, %rax      ; 즉시값 → 레지스터
movq %rax, -8(%rbp)   ; 레지스터 → 메모리
movq (%rdi), %rax     ; 메모리 → 레지스터

 메모리 ↔ 메모리 직접 이동은 불가능. 중간에 레지스터를 거쳐야 함.

 스택 명령어 및 구조

pushq %rax    ; %rsp -= 8, 값 저장
popq %rbx     ; %rbx = 메모리[%rsp], %rsp += 8
스택 핵심 개념 요약
특징 설명
스택 방향 낮은 주소 방향으로 쌓임
%rsp 스택의 최상단(top)을 가리킴
push 값을 %rsp보다 더 아래 주소에 저장하고 %rsp를 감소
pop %rsp가 가리키는 값을 꺼내고 %rsp를 증가
예시
• %rsp = 0x108
• pushq $0x123 실행 시:
    1. %rsp -= 8 → %rsp = 0x100
    2. [0x100] = 0x123 저장됨

• 이어서 popq %rdx 실행 시:
    1. [0x100] → %rdx
    2. %rsp += 8 → %rsp = 0x108
   주의!
  • 0x100에 저장된 값은 여전히 남아 있지만, %rsp보다 위쪽 주소이미 사용된 무효 데이터
  • 언제든지 push로 덮어쓰기 가능하므로 의미 없는 값일 수 있음
  • movq 8(%rsp), %rdx처럼 읽을 수는 있지만, 위험할 수 있음

 

3.5 산술 및 논리 연산 (Arithmetic and Logical Operations)

 산술 연산

addq %rbx, %rax   ; %rax += %rbx
subq %rcx, %rax   ; %rax -= %rcx
imulq %rdx, %rax  ; %rax *= %rdx

쉬프트 연산 (Shift Operations)

연산 명령어 설명
왼쪽 쉬프트 shl, sal 곱셈 효과 (* 2^n)
오른쪽 쉬프트 (논리) shr unsigned 나눗셈 (왼쪽에 0 채움)
오른쪽 쉬프트 (산술) sar signed 나눗셈 (왼쪽에 부호비트 채움)
예시
shlq $1, %rax   ; %rax = %rax * 2
sarq $2, %rbx   ; %rbx = %rbx / 4 (signed)
shr $1, %rcx    ; %rcx = %rcx / 2 (unsigned)

 쉬프트 종류 비교

명령어 종류 채움 방식 사용 목적
sar 산술 왼쪽에 부호 유지 signed 정수 나눗셈
shr 논리 왼쪽에 0 채움 unsigned 정수 나눗셈

기타 비트 연산

연산 의미 기억 방법
orq 하나라도 1이면 1 덧붙이기
andq 둘 다 1이어야 1 필터처럼 걸러내기
xorq 다르면 1, 같으면 0 반전, 토글

쉬프트와 비트 연산은 빠르고 효율적인 계산 및 데이터 조작에 필수!

 3.6 제어 (Control)

 조건 코드 (Condition Codes)

비교 명령 (cmp, test) 후에 플래그 설정됨:

  • ZF (Zero Flag): 결과가 0인지
  • SF (Sign Flag): 부호
  • OF (Overflow): 오버플로 발생 여부

 조건 분기 명령

cmpq %rsi, %rdi
jl label     ; %rdi < %rsi 일 때 점프
je label     ; %rdi == %rsi 일 때 점프

 반복문 / 루프

loop_start:
    cmpq $0, %rdi
    je loop_end
    ; 반복 실행
    decq %rdi
    jmp loop_start
loop_end:

📌 switch 문

jump table을 통해 jmp *table(,%rax,8) 형태로 구현됨

 

'개념 공부' 카테고리의 다른 글

컴퓨터 시스템 7장-링커(Linking) 1-1  (0) 2025.04.19
포인터  (0) 2025.04.14
컴퓨터 시스템에서의 가상화  (1) 2025.04.12
컴퓨터 시스템 2주차  (0) 2025.04.03
파이썬 List는 과연 무엇인가?  (2) 2025.03.27