함수호출

Category
아이템: 
포스트 갯수3

[Arm프로세서] AAPCS: Armv8: X30 링크 레지스터와 어셈블리 명령어 분석

By Guillermo Austin Kim | 2021년 8월 30일 | 
SP 레지스터보다 링크 레지스터인 X30은 '함수 호출'에서 가장 중요한 역할을 수행합니다. 함수를 호출한 다음에 복귀할 주소를 X30 레지스터가 저장하기 때문입니다. 우리가 함수를 작성하면 어디선가 함수를 호출할 것이라 예상합니다. 그런데 함수를 호출한 다음, 호출된 함수의 실행이 종료되면 (함수를 호출한 코드 기준으로) 바로 아랫 부분에 있는 코드가 실행됩니다. X30 레지스터와 관련된 예제 코드 분석 이번에는 아래와 같이 main() 함수의 코드(C 코드와 어셈블리 코드로 같이 변환)을 보면서 이 내용에 대해 조금 더 알아봅시다. 01 0x10000 <main>:02 {03 0x10000: f81e0ffe str x30, [sp, #-32]!04 int res =

[Arm프로세서] AAPCS: Armv7: 함수 반환형은 워드 단위로 지정

By Guillermo Austin Kim | 2021년 7월 5일 | 
함수를 반환하는 자료형은 워드 단위로 제한하는 것이 좋습니다. 워드형인 경우 반환값은 R0 레지스터에 저장하나, 데이터가 워드 범위를 벗어난 경우 R0와 R1레지스터에 반환값을 나눠서 처리하기 때문입니다. [정보]위에서 언급한 워드형이 무엇인지 알아봅시다. 워드(word)는 어셈블리 명령어로 연산 결과를 레지스터에 저장할 수 있는 데이터 단위입니다. 그렇다면 함수가 반환하는 타입이 무엇인지 파악하려면, 함수 선언부의 가장 앞 부분을 보면 됩니다. 예를 들어 이번 소절에서 소개한 add_func() 함수는 int 형의 인자를 반환합니다. int add_func(int a, int b, int c, int d, int e); 대부분 함수가 반환하는 자료형은 워드 타입으로, int, unsinged int

[Arm프로세서] AAPCS: Armv7: 함수를 호출하기 위한 디자인

By Guillermo Austin Kim | 2021년 5월 24일 | 
Armv7 아키텍처 관점으로 AAPCS를 보통 SP 레지스터와 LR 레지스터가 어떻게 바뀌는지 기준으로 설명합니다. 하지만 실제 거의 대부분 임베디드 혹은 시스템 개발자들은 SP와 LR 레지스터를 설정하는 어셈블리 코드를 입력하지 않습니다. 그 이유는 대부분 C 프로그래밍으로 코딩을 하기 때문입니다. SP와 LR 레지스터를 보면 낯설게 느끼기 마련입니다. 이번 절에서는 실제 함수를 호출하는 예시 코드와 함께, 함수를 호출하면 SP와 LR 레지스터가 어떻게 바뀌는지 알아보겠습니다. 함수를 호출될 때의 세부 동작 원리 파악하기 여러분이 다음과 같은 함수를 작성했다고 가정하겠습니다. 01 int add_func(int x, int y)02 {03 int result = x + y;04 prin