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: 즉시값, 예:$0x10Register: 레지스터, 예:%raxMemory: 간접 참조, 예: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 |