Posts
20 posts[Arm프로세서] AAPCS: Armv8: X30 링크 레지스터와 어셈블리 명령어 분석
SP 레지스터보다 링크 레지스터인 X30은 '함수 호출'에서 가장 중요한 역할을 수행합니다. 함수를 호출한 다음에 복귀할 주소를 X30 레지스터가 저장하기 때문입니다. 우리가 함수를 작성하면 어디선가 함수를 호출할 것이라 예상합니다. 그런데 함수를 호출한 다음, 호출된 함수의 실행이 종료되면 (함수를 호출한 코드 기준으로) 바로 아랫 부분에 있는 코드가 실행됩니다. X30 레지스터와 관련된 예제 코드 분석 이번에는 아래와 같이 main() 함수의 코드(C 코드와 어셈블리 코드로 같이 변환)을 보면서 이 내용에 대해 조금 더 알아봅시다. 01 0x10000 :02 {03 0x10000: f81e0ffe str x30, [sp, #-32]!04 int res =
[Arm프로세서] AAPCS: Armv8: 브랜치와 복귀 명령어 - RET
마지막으로 AAPCS와 연관된 명령어로 RET 에 대해 알아봅시다. 다음은 Arm 스팩 문서에서 명시된 RET 명령어에 대한 내용입니다. C6.2.219 RET Return from subroutine branches unconditionally to an address in a register, with a hint that this is a subroutine return.[출처: DDI0487Fc_armv8_arm.pdf] Armv8 아키텍처에서 꼭 알아둬야 할 명령어가 RET입니다. RET는 Return from subroutine의 약자인데, 서브 루틴을 호출한 후 복귀할 주소가 담긴 X30 레지스터의 값을 PC로 로딩하는 역할을 수행합니다. 여기서 X30 레지스터의 값을 PC에 로딩하는 동
[Arm프로세서] AAPCS: Armv8: 스택과 관련된 명령어 - ldp
Armv7 아키텍처에서 push 명령어를 실행한 후 함수가 종료되기 직전에 반드시 실행되는 명령어가 pop입니다. 마찬가지로 Armv8 아키텍처에서 stp 명령어를 사용해 스택에 레지스터를 푸시한 후, 함수를 종료하기 직전에 실행되는 명령어는 ldp입니다. Arm 스팩 문서에서 ldp 명령어 분석하기 이번에도 Arm 스팩 문서를 보면서 ldp 명령어에 대해 살펴봅시다. C6.2.129 LDPLoad Pair of Registers calculates an address from a base register value and an immediate offset, loads two 32-bit words or two 64-bit doublewords from memory, and writes them
[Arm프로세서] AAPCS: Armv8: 스택과 관련된 명령어 - sub
sub는 지정된 상수만큼 감소시키는 연산을 수행하는 명령어인데, stp 명령어 전 후로 'sub sp, sp, #16'와 같이 SP 레지스터의 값을 감소시키는 명령어를 볼 수 있습니다. 이 동작은 Armv7 아키텍처에서 배운 내용과 같으며, 다음과 같이 해석할 수 있습니다. “함수 내에 선언된 지역 변수를 사용하기 위해 스택 공간을 확보한다.” sub 명령어로 SP 레지스터의 값을 변경하는 동작은 Armv7와 Armv8 아키텍처에 같이 적용되는 내용입니다. Written by 저자




