ARM7 Reference
해당 링크에서 레퍼런스 파일을 받을 수 있다.
ARM7 Quick Card
해당 링크에서 짧게 요약된 버전을 받을 수 있다.
현재 Keil과 Segger 툴을 사용중이고, Assembly는 Segger Studio를 사용중이다.
C와 Assembly 동시 사용
main.c
에서 assem.s
라는 assembly 파일에 정의된 함수를 불러와서 쓸 수 있는데DoAdd
라는 함수를 assembly에서 정의하여 불러와서 사용하는 예시이다.
main.c
#include <stdio.h>
#include <stdlib.h>
extern int DoAdd(int, int);
int main(void) {
printf("Program Started\n");
int a = DoAdd(3, -1);
printf("Add: %d\n", a);
printf("Program Ended\n");
return 0;
}
assembly.s
.global DoAdd
.align 4
DoAdd:
adds r0, r0, r1
mov pc, lr
다음 코드를 자세히 살펴보면, 우선 extern int DoAdd(int, int)
로 C파일 외부에 정의된 함수를 선언한다.
그 다음 main
을 보면 DoAdd(3, -1);
에서 3과 -1을 매개변수로 넘겨주게되는데
그러면 이 3과 -1은 어디에 저장이 될까?
매개변수들은 r0, r1, r2, r3
레지스터에 차례로 4개까지는 전달해주고
그 이상은 Stack
에 넣어서 전달한다.
따라서 현재 Assembly에서 r0
와 r1
에 저장된 3과 -1을 연산 후에 다시 r0
에 저장한다.return
값은 r0
에 저장하여 전달해주기 때문이다.
마지막 pc(Program Counter)
에 lr(Link Register)
값을 전달하며 기존의 C로 복귀하게 된다.
Summary
정리하자면 C에서 Assembly를 호출하면 레지스터에 매개변수를 넣어서 전달하며, Return 값은 r0에 넣어서 전달하게 된다.