aarch64의 함수 호출 패턴

aarch64의 함수 호출 패턴

2024년 12월 12일

https://mariokartwii.com/armv8/

호출규약 #

호출규약 #

레지스터 역할 #

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

함수 프롤로그 #

일반적인 함수 #

  1. 스택 할당 후 이전 레지스터 스택에 백업
  2. 전달받은 인자들을 저장
 1; 이 Stack 의 의미는 함수 호출 전 (sub로 스택 확장 전) sp를 의미한다. 
 2Stack[-0x10]:8 local_10    ; 이전 sp 기준으로 -0x10 위치가 local_10 으로 네이밍됐다. 
 3Stack[-0x20]:8 local_20 
 4Stack[-0x30]:8 local_30
 5Stack[-0x40]:8 local_40
 6Stack[-0x48]:8 local_48
 7
 8; 스택 공간 0x80 바이트 할당 (로컬변수 + 이전 레지스터 백업 공간)
 901e36650    sub     sp, sp, #0x80
10; x29(fp), x30(lr) 을 이전 sp 기준 -0x40 에 백업한다. (== 현재sp + 0x40)
1101e36654    stp     x29, x30, [sp, #local_40]
12; x29 = fp = sp + 0x40. 스택프레임 세팅. 
1301e36658    add     x29, sp, #0x40
14; x23도 이전sp - 0x30 (==현재sp + 0x50) 위치에 백업
1501e3665c    str     x23, [sp, #local_30]
1601e36660    stp     x22, x21, [sp, #local_20]
1701e36664    stp     x20, x19, [sp, #local_10]
18; x23에 TLS 의 베이스 주소 저장
1901e36668    mrs     x23, tpidr_el0     
20            ... 
21; canary 값을 현재sp + 0x38 위치에 저장한다. 
2201e36670    ldr     x8, [x23, #0x28]    
23            ...
2401e36680    stur    x8, [x29, #local_48]

함수 에필로그 #

comments powered by Disqus