x86 어셈블리는 Intel x86 아키텍처의 명령어 집합을 직접 사용하는 저수준 프로그래밍 언어다. 리버스 엔지니어링, 성능 최적화, 운영체제 개발의 기반이 된다.
레지스터 구조 (x86-64)
64비트 32비트 16비트 8비트(상) 8비트(하)
RAX = EAX = AX = AH = AL (Accumulator)
RBX = EBX = BX = BH = BL (Base)
RCX = ECX = CX = CH = CL (Counter)
RDX = EDX = DX = DH = DL (Data)
RSI = ESI = SI = - = SIL (Source Index)
RDI = EDI = DI = - = DIL (Dest Index)
RSP = ESP = SP = - = SPL (Stack Pointer)
RBP = EBP = BP = - = BPL (Base Pointer)
R8~R15: 64비트 전용 추가 레지스터
기본 명령어
nasm
; NASM 문법 (Intel 형식)
section .data
msg db "Hello, World!", 0x0A, 0 ; 문자열 + 개행 + null
section .text
global _start
_start:
; 함수 호출 규약 (System V AMD64 ABI)
; 인자: RDI, RSI, RDX, RCX, R8, R9 (순서대로)
; 반환: RAX
; write(1, msg, 14) 시스템 콜
mov rax, 1 ; syscall 번호 (write)
mov rdi, 1 ; fd = stdout
mov rsi, msg ; 버퍼 주소
mov rdx, 14 ; 바이트 수
syscall
; exit(0) 시스템 콜
mov rax, 60 ; syscall 번호 (exit)
xor rdi, rdi ; 종료 코드 = 0
syscall
스택 프레임
nasm
; 함수 프롤로그/에필로그
add_numbers:
push rbp ; 기존 베이스 포인터 저장
mov rbp, rsp ; 새 스택 프레임 설정
sub rsp, 16 ; 로컬 변수 공간 확보
; 로컬 변수: [rbp-8], [rbp-16]
mov qword [rbp-8], rdi ; 첫 번째 인자 저장
mov qword [rbp-16], rsi ; 두 번째 인자 저장
mov rax, [rbp-8]
add rax, [rbp-16] ; 합산 (반환값 RAX)
leave ; mov rsp, rbp + pop rbp
ret
관련 문서