Stack Memory, Stack Frame

스택 메모리, 스택 프레임

레지스터는 다양한 용도로 사용된다.
기존의 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

좋은 웹페이지 즐겨찾기