| 종류 | 레지스터 | 설명 |
|---|---|---|
| 인자 전달용 | %rdi, %rsi, %rdx, %rcx, %r8, %r9 | 첫 6개의 인자 전달 (x86-64 System V 기준) |
| 리턴값 | %rax | 함수 결과가 여기에 담김 |
| 스택 포인터 | %rsp | 현재 스택의 top을 가리킴 |
| 프레임 포인터 | %rbp | 이전 스택 프레임의 기준점 |
| 임시 계산용 | %rax, %rcx, %rdx, ... | 연산 중간 저장에 사용 |
| 보존용 | %rbx, %r12~%r15 등 | 함수 호출 간 값을 유지해야 하는 레지스터들 (callee-saved) |
함수에 인자를 넘길 때는 아래 순서대로 레지스터를 사용해:
| 인자 번호 | 레지스터 |
|---|---|
| 1 | %rdi |
| 2 | %rsi |
| 3 | %rdx |
| 4 | %rcx |
| 5 | %r8 |
| 6 | %r9 |
| 7번 이상 | 스택에 push 해서 전달함 |
%rax에 저장return 42; → %rax = 42| 구분 | 이름 | 설명 |
|---|---|---|
| Caller-saved | %rax, %rcx, %rdx, %rsi, %rdi, %r8, %r9, %r10, %r11 | 호출한 쪽이 백업해야 함 |
| Callee-saved | %rbx, %rsp, %rbp, %r12~%r15 | 호출당한 함수가 백업해야 함 (push, pop) |
| 크기 | 이름 | 비트수 | 예시 |
|---|---|---|---|
| 64비트 | %rdi, %rax, ... | 8바이트 (64bit) | movq, addq, callq 등 |
| 32비트 | %edi, %eax, ... | 4바이트 (32bit) | movl, addl |
| 16비트 | %di, %ax, ... | 2바이트 (16bit) | movw, addw |
| 8비트 | %dil, %al, ... | 1바이트 (8bit) | movb, addb |
%rdi, %edi, %di, %dil을 쓰는 상황| 언제 | 어떤 크기? | 어떤 이름? |
|---|---|---|
| long, pointer, 64비트 정수 | 64비트 | %rdi |
| int, 32비트 정수 | 32비트 | %edi |
| short, 16비트 정수 | 16비트 | %di |
| char, 8비트 정수 | 8비트 | %dil |
전달할 값의 크기(자료형)에 따라 자동으로 결정됨.
| 명령어 | 뜻 | 비트 변환 |
|---|---|---|
movsbl | Sign-extend byte → long | 8 → 32비트 |
movsbq | Sign-extend byte → quad | 8 → 64비트 |
movswl | Sign-extend word (16) → long (32) | 16 → 32비트 |
movswq | Sign-extend word (16) → quad (64) | 16 → 64비트 |
movslq | Sign-extend long (32) → quad (64) | 32 → 64비트 |
| 명령어 | 뜻 | 비트 변환 |
|---|---|---|
movzbl | Zero-extend byte → long | 8 → 32비트 |
movzbq | Zero-extend byte → quad | 8 → 64비트 |
movzwl | Zero-extend word → long | 16 → 32비트 |
movzwq | Zero-extend word → quad | 16 → 64비트 |
| 종류 | 부호 있음? | 값의 범위 예 (8비트 기준) |
|---|---|---|
signed (기본) | ✅ 있음 | -128 ~ +127 |
unsigned | ❌ 없음 | 0 ~ 255 |
| 목적 | 명령어 | 결과 값 예 |
|---|---|---|
| char → int (32bit 부호 확장) | movsbl | 0xFFFFFFFF |
| char → long (64bit 부호 확장) | movsbq | 0xFFFFFFFFFFFFFFFF |
| char → long (64bit zero 확장) | movzbq | 0x00000000000000FF |
| 방향 | 동작 | 예시 명령어 |
|---|---|---|
작은 → 큰 (char → int) | 확장 필요 (sign/zero extend) | movsbl, movzbl 등 |
큰 → 작은 (int → char) | 잘라내기 (하위 비트만 사용) | movb %al, (%rsi) 등 |