x86-64 중앙 처리 장치(CPU)는 64비트 값을 저장하는 16개의 범용 레지스터 세트를 포함. 이러한 레지스터는 정수 데이터뿐만 아니라 포인터를 저장하는 데 사용.
16개 레지스터의 이름은 모두 %r로 시작하지만, 명령 세트의 역사적 발전으로 인해 여러 다른 명명 규칙을 따름:
원래 8086 (16비트): 8개의 16비트 레지스터 (%ax ~ %bp)
IA32 확장 (32비트): 레지스터를 32비트로 확장 (%eax ~ %ebp)
x86-64 확장 (64비트):
%rax ~ %rbp)%r8 ~ %r15)16개 레지스터의 하위 바이트에 저장된 다양한 크기의 데이터에 대해 명령이 작동:
| 크기 | 접근 범위 | 예시 레지스터 |
|---|---|---|
| 바이트 (8비트) | 최하위 1바이트 | %al, %bl, %cl, %dl |
| 워드 (16비트) | 최하위 2바이트 | %ax, %bx, %cx, %dx |
| 더블워드 (32비트) | 최하위 4바이트 | %eax, %ebx, %ecx, %edx |
| 쿼드워드 (64비트) | 전체 레지스터 | %rax, %rbx, %rcx, %rdx |

Figure 3.2: 정수 레지스터. 모든 16개 레지스터의 하위 부분은 바이트, 워드(16비트), 더블워드(32비트), 쿼드워드(64비트) 수량으로 접근 가능.
8바이트보다 적게 생성하는 명령의 경우:
%rsp)대부분의 명령은 연산 수행에 사용할 소스 값과 결과를 배치할 대상 위치를 지정하는 하나 이상의 피연산자를 가짐.
x86-64는 여러 피연산자 형태를 지원:

Figure 3.3: 피연산자 형태. 피연산자는 즉시값(상수), 레지스터 값, 또는 메모리의 값을 나타낼 수 있습니다. 스케일링 팩터 s는 1, 2, 4, 또는 8이어야 합니다.
$-577, $0x1Fra: 임의의 레지스터 aR[ra]: 레지스터 식별자로 인덱싱된 배열 R로 본 레지스터 세트에서의 값Mb[Addr] - 주소 Addr에서 시작하는 b바이트 값에 대한 참조구문: Imm(rb,ri,s)
구성 요소:
Imm: 즉시값 오프셋rb: 베이스 레지스터 (64비트 레지스터여야 함)ri: 인덱스 레지스터 (64비트 레지스터여야 함)s: 스케일 팩터 (1, 2, 4, 또는 8이어야 함)유효 주소 계산: Imm + R[rb] + R[ri] × s
어셈블리 명령어의 피연산자는 소스(Source) 와 목적지(Destination) 로 나뉘며, 피연산자의 종류는 크게 3가지:
Immediate (즉시 값):
$ 기호로 표기됨 (예: $0x1F)
상수 값을 의미
movq $10, %rax # 64비트 레지스터 rax에 정수 10을 저장
Register (레지스터 참조):
예: %rax, %eax, %al 등
64, 32, 16, 8 비트 레지스터의 하위 일부분도 접근 가능
movq %rax, %rbx # rax의 값을 rbx로 복사
addq %rcx, %rdx # rcx의 값을 rdx에 더함
Memory (메모리 참조):
(1) 단순 메모리 주소 (Indirect)
movq (%rax), %rbx # rax가 가리키는 메모리 주소의 값을 rbx로
(2) 베이스 + 오프셋 (Base + Displacement)
movl 8(%rbp), %eax # rbp 기준으로 오프셋 8 바이트 떨어진 값 가져오기
로컬 변수나 함수 인자 접근에 많이 쓰이는 형식
(3) 인덱스 + 스케일 (Indexed)
movl (%rdi,%rax,4), %ecx # ecx = *(rdi + rax*4)
배열 접근할 때 유용. 예: arr[rax]
(4) 전체형태: Imm(rb, ri, s)
movl 12(%rdi,%rsi,4), %eax # eax = *(rdi + rsi*4 + 12)
배열 내 구조체 필드처럼 복잡한 위치에 접근할 때 사용
예를 들어: structs[i].field 같은 접근
✨ 참고
mov %rax, %rbx 라면, %rax가 소스, %rbx가 목적지
즉, %rax의 값을 %rbx에 "복사"