..
컴퓨터 구조 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 ; 함수 복귀