레지스터는 다양한 용도로 사용된다.
기존의 rax, rbx 등과 같은 범용 레지스터가 있고,
스택을 위한 Pointer Register 가 존재한다.
ip(Instruction Pointer)
- 다음 수행 명령어 위치
sp(StackPointer)
- 현재 스택 TOP 위치
bp(BasePointer)
- 스택 상대주소 계산용
%include "io64.inc"
section .text
global CMAIN
CMAIN:
push 1 ;스택 : [1]
push 2 ;스택 : [1,2]
call MAX ;스택 : [1,2,ret], ret: 현재부분의 리턴 주소 (함수에 들어갔다가 빠져나올 용도)
PRINT_DEC 8, rax
NEWLINE
; 위까지 실행하면 크래쉬가 난다. (스택을 비워주지않아서)
add rsp, 16 ;스택 포인터를 16 더해서 초기
xor rax, rax
ret
MAX:
push rbp ;스택에 베이스 포인터 고정 / 스택 : [1,2,ret,이전bp값] / 함수안에서 또 다른 함수를 호출했을때 돌아오기위해 사용
mov rbp, rsp ; rbp 고정 (현재 스택포인터 위치를 rbp에 넣어줌), 스택에 있는 1,2 를 상대주소로 접근하기위해서
mov rax, [rbp+16]
mov rbx, [rbp+24]
cmp rax, rbx
jg L1
mov rax, rbx
L1:
pop rbp
ret