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에 넣어서 전달하게 된다.