aarch64의 함수 호출 패턴

https://mariokartwii.com/armv8/

호출규약

호출규약

레지스터 역할

  • x0 ~ x7 : caller-saved 레지스터
  • x19 ~ x28 : callee-saved 레지스터
  • x8 :
  • x29: FP(스택베이스), x30: LR(링크레지스터)

함수 프롤로그

일반적인 함수

  1. 스택 할당 후 이전 레지스터 스택에 백업
  2. 전달받은 인자들을 저장
; 이 Stack 의 의미는 함수 호출 전 (sub로 스택 확장 전) sp를 의미한다. 
Stack[-0x10]:8 local_10    ; 이전 sp 기준으로 -0x10 위치가 local_10 으로 네이밍됐다. 
Stack[-0x20]:8 local_20 
Stack[-0x30]:8 local_30
Stack[-0x40]:8 local_40
Stack[-0x48]:8 local_48

; 스택 공간 0x80 바이트 할당 (로컬변수 + 이전 레지스터 백업 공간)
01e36650    sub     sp, sp, #0x80
; x29(fp), x30(lr) 을 이전 sp 기준 -0x40 에 백업한다. (== 현재sp + 0x40)
01e36654    stp     x29, x30, [sp, #local_40]
; x29 = fp = sp + 0x40. 스택프레임 세팅. 
01e36658    add     x29, sp, #0x40
; x23도 이전sp - 0x30 (==현재sp + 0x50) 위치에 백업
01e3665c    str     x23, [sp, #local_30]
01e36660    stp     x22, x21, [sp, #local_20]
01e36664    stp     x20, x19, [sp, #local_10]
; x23에 TLS 의 베이스 주소 저장
01e36668    mrs     x23, tpidr_el0     
            ... 
; canary 값을 현재sp + 0x38 위치에 저장한다. 
01e36670    ldr     x8, [x23, #0x28]    
            ...
01e36680    stur    x8, [x29, #local_48]

함수 에필로그

ESC
Type to search...