day4. 5.2

arm64

RISC라서 명령어가 적고 간단하게 생겼음. 그래서 성능향상과 전력소모가 감소된다.(모바일에 최적)
로드,스토어 명령으로만 메모리에 접근할 수 있다.

32bit 아키텍쳐와의 호환성은 aarch32 모드 명령 실행으로 인해 보장된다. aarch32 모드는 레지스터를 32bit로만 접근 가능하고, aarch64 모드는 32bit 64bit 모두 접근가능하다.

레지스터

  • x0~x7 : 함수 호출 인자나 리턴값 저장용도로 사용됨. 8개 보다 많으면 스택으로 전달됨. 호caller-saved 라서 필요하다면 호출한녀석이 저장해야한다.
  • x8: 일반함수호출 규약에서 큰 구조체를 리턴할때 쓸 주소를 인자로 전달하기도 함. caller-saved
  • x9~x18: 임시 레지스터. 컴파일러가계산 중간값이나 임시포인터등에 마음껏 쓰는 레지스터. caller-saved
  • x19~x28: 임시 레지스터지만, callee-saved 레지스터라서 함수안에서 사용할거라면 프롤로그에서 스택에 백업한다.
  • x29: FP(프레임포인터) 디버깅/스택 언와인딩에서 프레임체인 만들때 핵심. 함수 호출 시 스택 바닥을 바로 접근해서 인자를 효율적으로 접근할 수 있게함 callee-saved
  • x30: LR(링크레지스터) 리턴 주소로 사용하는 레지스터이다. bl 같은걸로 점프하면 다음 실행주소가 lr에 저장된다. b로 점프할땐 아님. 보통 프레임포인터와 함수 시작할때 바로 저장된다.
  • x16: 시스템콜 번호. svc 명령이 있을때마다 번호는 x16에 저장되며, 어플리케이션이 실행하려는 시스템콜을 식별할 수 있게한다.
  • x31: 일반레지스터, 제로레지스터(0이 저장되어있음), 스택포인터레지스터(SP)
  • pc: CPU가 실행할 다음 명령을 보관함. 명령어크기를 오프셋으로 PC에 계속 더해서 다음명령을 찾는다. PC상대주소로 빌드하면 PIC(위치독립코드)가 된다. 동적으로 로드되는 모듈이나 ASLR(실행할때마다 무작위주소로 로드) 적용에도 PIC가 필요하다ㅓ.
  • apsr: Application Program Status Register. 연산결과 플래그들을 담는 레지스터
  • cpsr: Current Program Status Register. 실행상태, 제어정보가 포함된 현재 상태 전체를 의미한다. IRQ마스크(1이면 비활성), FIQ마스크, AsyncAbort 마스크, Thumb상태비트(1이면 thumb 모드), 현재 CPU 모드관련 비트플래그 등 aspr+cspr = 현재 상태레지스터

x레지스터는 64bit이며, w레지스터는 하위 32bit만 사용한다.

op dst, src

SP 레지스터도 명시적으로 수정되지 않지만 stp, ldp 명령을 사용해서 이동시킨다.

ldr x0, [x1]          ; x0 = *x1
ldr x0, [x1, 0x10]!   ; x1 += 0x10; x0 = *x1
ldr x0, [x1], 0x10    ; x0 = *x1; x1 + 0x10
str x0, [x1]          ; *x1 = x0
stp x0, x1, [x2]      ; *x2 = x0; *(x2 + 8) = x1

svc 0                 ; syscall number = x16

blr x0                ; x0에 저장된 위치로 점프. x30에 리턴주소 백업
br x0                
bl label              ; label로 점프하면서 x30에 리턴주소 백업
ret                   ; x30으로 점프. 공격의 대상이 될 수 있음

adr x0, 0x12345       ; x0 = PC + 0x12345

adrp x0, label        ; x0 = (PC & ~0xFFF) + (label_page_address << 12)
add x0, x0, 0x234f    ; 마지막으로 오프셋 조정. 보통 adpr 명령과 세트이다.

adr, adrp 는 코드나 데이터 접근을 위해 효율적으로 주소를 계산하고 레지스터에 로드한다.
adr은 PC 에서의 상대주소를 구하는것이다.(가까운경우)
adrp는 더 큰 주소를 만들어야 하는 경우 사용한다. 페이지단위(0x1000)의 값을 만들게된다. 여기에 값을 더해서 정확한 주소를 만들 수 있게된다. (+-4GB까지 이동할 수 있음)

ESC
Type to search...