AAPCS

2025. 6. 30. 15:48·ARM arch/Cortex-M

procedure call standard for ARM instruction

어셈블리 함수 C호출 예제

ARM 어셈블리에서는 함수 호출과 반환이 AAPCS (ARM Architecture Procedure Call Standard)에 따라 이루어짐.

아래는 2개의 int 값을 더해서 반환하는 어셈블리 함수를 C에서 호출하는 예제

 


어셈블리 함수 (libs.s)

    .global  FIRST_ASM_FUNC

FIRST_ASM_FUNC:           @ 함수 시작 (전역 레이블)
    add r0, r1            @ r0 = r0 + r1 (r0: 첫 번째 인자, r1: 두 번째 인자)
    bx lr                 @ 복귀 (lr에 저장된 주소로 분기), r0 값이 반환됨

C 코드에서의 호출 (main.c)

int FIRST_ASM_FUNC(int, int);

int main() {
    // 어셈블리 함수 호출
    char result = FIRST_ASM_FUNC(7, 8);

    printf("result = %d\n", result); // result = 15
    return 0;
}

왜 작동하는가? (AAPCS 규약 요약)

역할 레지스터

인자 전달 r0, r1
반환값 r0
복귀 주소 lr
  • C에서 int a, int b를 함수에 넘기면 r0, r1에 담김.
  • 어셈블리에서 add r0, r1 수행 → 결과를 r0에 저장.
  • bx lr으로 복귀 → C는 r0 값을 그대로 반환값으로 받음

FIRST_ASM_FUNC:
    add r0, r1
    bx lr

함수를 다시 살펴보자.

이 함수는 인자를 2개 전달받는 함수이다.


AAPCS에 따라, 함수 인자는 r0부터 r3까지의 레지스터에 순서대로 저장된다.

add r0, r1 명령은 r0 = r0 + r1 연산을 수행하며, 결과를 r0에 저장한다.
즉, 두 인자의 합을 r0에 담는다.

 

bx lr 명령은 분기 명령으로, lr(Link Register)에 저장된 주소로 복귀한다.
이 lr에는 함수 호출 시 자동으로 저장된 복귀 주소(return address)가 들어 있다.

결과적으로, r0에 저장된 값을 반환하면서 호출한 위치로 돌아간다.

'ARM arch > Cortex-M' 카테고리의 다른 글

cortex-m3 AMBA와 메모리 맵  (0) 2025.07.14
2025.07.09 - ARM assembly 프로그래밍2  (0) 2025.07.09
2025.07.07 - ARM assembly 프로그래밍1  (0) 2025.07.08
빅 엔디언, 리틀 엔디언  (0) 2025.07.02
Thumb2 명령어 / 레지스터 / 핸들러 모드, 쓰레드 모드  (0) 2025.06.27
'ARM arch/Cortex-M' 카테고리의 다른 글
  • 2025.07.09 - ARM assembly 프로그래밍2
  • 2025.07.07 - ARM assembly 프로그래밍1
  • 빅 엔디언, 리틀 엔디언
  • Thumb2 명령어 / 레지스터 / 핸들러 모드, 쓰레드 모드
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    앤드류모튼
    Git
    파이썬
    rubikpi3
    버퍼
    yolo
    INIT
    리눅스
    Qualcomm
    시스템콜
    드라이버 분석
    토발즈
    이진 트리
    arm
    rubik pi
    커널 기여
    commit
    백준
    파일 입출력
    피보나치
    c언어
    소수
    자료구조
    커널
    순환
    Branch
    동적메모리
    스택
    포인터
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
AAPCS
상단으로

티스토리툴바