..

컴퓨터 구조 CS:APP 3장 어셈블리

정수 레지스터

1. x86-64 레지스터 종류 및 명칭

CSAPP 기준으로 x86-64 아키텍처에는 총 16개의 64비트 범용 레지스터가 있으며, 레지스터는 다양한 크기로 접근할 수 있다

기본 16개 레지스터 (64비트 기준)

레지스터 용도 요약 (관례적) 하위 호환 이름 (32/16/8비트)
%rax 함수 반환값, 산술 연산용 %eax, %ax, %al
%rbx 베이스 (보존) %ebx, %bx, %bl
%rcx 루프 카운터 %ecx, %cx, %cl
%rdx 함수 인자, 산술용 %edx, %dx, %dl
%rsi 함수 인자 %esi, %si, %sil
%rdi 함수 인자 %edi, %di, %dil
%rsp 스택 포인터 %esp, %sp, %spl
%rbp 베이스 포인터 %ebp, %bp, %bpl
%r8~%r15 함수 인자/임시 저장용 %r8d~%r15d, %r8w~%r15w, %r8b~%r15b

%rax, %rcx, %rdx, %rbx, %rsp, %rbp, %rsi, %rdi 는 IA-32 확장에서 유래하였으며
%r8 ~ %r15 는 x86-64에서 새롭게 추가된 레지스터이다


2. 부동소수점 및 SIMD 레지스터

레지스터 설명
%xmm0 ~ %xmm15 128비트 SSE 레지스터 (float, double 등)
%ymm0 ~ %ymm15 256비트 AVX 레지스터 (벡터 연산용, %xmm 확장)

%xmmN은 %ymmN의 하위 128비트이며, 명령어 예: movaps, vmovss 등


3. 주요 어셈블리어 명령어 종류

x86-64에서 사용하는 주요 명령어는 5가지 클래스로 구분된다

1. 데이터 이동 (Data Movement)

명령어 설명
mov 데이터 복사
push 스택에 저장
pop 스택에서 꺼냄
lea 주소 계산 (load effective address)

2. 산술/논리 연산 (Arithmetic & Logical)

명령어 설명
add, sub 덧셈, 뺄셈
imul, idiv 곱셈, 나눗셈
and, or, xor 비트 연산
not, neg 반전/부호 반전
shl, shr, sar, sal 비트 시프트

3. 제어 흐름 (Control Flow)

명령어 설명
jmp 무조건 점프
call, ret 함수 호출/복귀
je, jne, jg, jl, jge, jle 조건부 점프

4. 비교 및 조건 코드 설정

명령어 설명
cmp, test 비교, 테스트 연산
set* 조건 코드 설정 (예: sete, setne, setg 등)

5. 기타 명령어

명령어 설명
nop 아무 것도 하지 않음
rep, repz 반복 접두어

접미사 b/w/l/q는 각각 1/2/4/8바이트를 의미한다
예: movq, movl, addb 등


4. 레지스터와 명령어 사용 예시

movq $5, %rax     ; 정수 5를 %rax에 저장
addq %rbx, %rax   ; %rbx의 값을 %rax에 더함
call func         ; func 함수 호출
ret               ; 함수 복귀