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 |