반응형
'CS/컴퓨터 시스템' 카테고리의 글 목록
Hello World
skylarcoding.tistory.com

3.1 역사적 관점
우리가 현재 쓰는 CPU의 대부분은 x86-64라는 설계를 따른다.
- 16 → 32 → 64 비트
- 비트 수가 올라가면 : 한 번에 다룰 수 있는 데이터가 커지고, 쓸 수 있는 메모리도 커진다.
하위 호환성
이후 세대 프로세서는 이전 세대용으로 컴파일된 코드를 계속 실행할 수 있어야 했고, 그 결과 명령어 집합에 역사적 잔재 (옛날 기능들) 가 많이 남아있다.
3.2 프로그램 인코딩
⭐️ Machine-Level Code 기계수준 코드
C 프로그램을 볼 때 안 보이던, 기계어 수준에서 드러나는 프로세서 상태 4가지
- PC (Program Counter, %rip) : 다음에 실행할 명령어의 메모리 주소
- 정수 레지스터 파일 : 64비트 값을 저장하는 16개의 이름 붙은 저장 공간. 포인터든 정수든 구분 없이 저장. 값 임시저장
- 조건 코드 레지스터 : 가장 최근 산술/ 논리 연산의 상태 정보 (직전 연산 결과 정보) → if, while 같은 조건 분기 구현에 사용
- 벡터 레지스터 : 정수/부동소수점 값을 담는 레지스터 집합
- C 에서는 배열, 구조체 같은 타입이 있지만, 기계어 수준에서는 메모리가 그냥 거대한 바이트 배열일 뿐이다. 부호 있는/없는 정수, 포인터/정수 구분이 어셈블리 코드에서는 없다.
- 프로그램이 쓰는 주소는 가상주소 (virtual address) 이며, 실제 물리 주소로의 변환은 OS가 관리한다.
- 명령어 하나는 아주 단순한 연산 (레지스터끼리 덧셈, 메모리 ↔ 레지스터 데이터 전송, 조건부 분기 등) 하나만 수행하고, 컴파일러가 이런 명령어들을 조합해서 반복문/함수 호출 같은 고수준 구성 요소를 구현한다.
컴파일 파이프라인
.c → (gcc) → .s 어셈블리 → (as) → .o 기계어 → (ld) → 실행파일
objdump -d 는 거꾸로 : 기계어 → 어셈블리로 되돌림
명령어 길이는 가변 (1 ~ 15 바이트)
자주 쓰는 명령어는 짧게, 드문건 길게 한다.
3.3 데이터 크기 표 + 접미사
Intel 만 word = 16 비트이다.

movb -> 1바이트 복사
movw -> 2바이트 복사
movl -> 4바이트 복사
movq -> 8바이트 복사
3.4 정보 접근
데이터가 어디에 있고, 어떻게 옮기는가
- x86-64에는 64비트 범용 레지스터 16개가 있고, %rax, %rbx, %rcx, %rdx, %rsi, %rdi, %rbp, %rsp, %r8~%r15 이다.
- 하나의 레지스터를 크기별로 다른 이름으로 접근할 수 있다.
ex) %rax(64비트) → %eax(하위 32비트) → %ax(하위 16비트) → %al (하위 8비트)
오퍼랜드 식별자 (Operand Specifier)
- immediate : 상수값, $ 기호로 시작
- register : 16개의 범용 레지스터 중 하나 %rax
- 오퍼랜드 타입 : 8(%rax, %rcx, 4) 메모리 참조, 계산된 유효주소(effective address) 로 메모리 위치에 접근
Imm(rb, ri, s)
유효주소 = Imm + R[rb] + R[ri] x s
C의 배열접근 a[i] 를 한번에 표현하기 위해 이런 형태 사용. a의 시작 주소가 rb, 인덱스 i 가 ri, 원소 크기가 s.
(%rax) -> %rax 가 가리키는 곳
8(%rax) -> %rax 가 가리키는 곳에서 8바이트 뒤
Imm : 상수 오프셋
rb : 베이스 레지스터
ri : 인덱스 레지스터
s : 스케일 팩터 (1,2,4,8 만 가능/ 자료형 크기와 대응)
데이터 이동 인스트럭션
movb : 1byte
movw : 2byte
movl : 4byte
movq : 8byte
소스 : 즉시값/ 레지스터/ 메모리 중 하나이다.
목적지 : 레지스터/ 메모리 중 하나이다.
메모리 → 메모리 직접 이동은 불가능하다. 반드시 레지스터를 거쳐야 한다.
movl 로 32비트 레지스터에 쓰면 상위 32 비트가 0이 된다. movb, movw는 상위 비트를 건드리지 않는다. → 남는 공간을 0으로 채운다 (변경 불가)
스택 데이터의 저장과 추출
스택은 높은 주소에서 낮은 주소로 자란다. %rsp 가 항상 꼭대기 (가장 낮은 주소) 를 가리킨다.
- pushq = %rsp 를 8 줄이고 그 자리에 값 저장
- popq = %rsp 가 가리키는 값을 읽고 %rsp 를 8 늘림
- 함수 호출 시 반환 주소와 지역 변수가 여기에 쌓인다.
반응형