I'm working on STM32CubeIDE.
To mix C and arm assembly, we initially used EXPORT.
Below is main.c:
#include <stdio.h>
extern int calc(int num, int* cnt);
int main()
{
    int cnt = 5;
    calc(4, &cnt);
    return 0;
}
And then calc.s:
AREA calculator, CODE
EXPORT calc
ALIGN
calc:PROC
    PUSH {r4,r5,lr}
    MOV r5, #13
    UDIV r4, r0, r5
    MUL r5, r4, r5
    SUB r4, r0, r5
    CMP r4,#0
    BEQ ace
    CMP r4,#8
    BGT jqk
then:   ADD r4, r4, #1
    B exit
ace:ADD [r1],#1
    MOV r4, #11
    B exit
jqk:MOV r4, #10
exit:MOV r0, r4
    POP {r4, r5, pc}
    ENDP
I put the two files in the same place and built main.c, but I get an error that says it's an unknown external reference.
So after giving up, I tried to put the ASM sentence in the c file using inline assembly.
calc    PROC
    PUSH    {r4, lr}
    AND     r4, r0, #12
    CMP     r4, #0
    BEQ ace
    CMP r4, #8
    BGT jqk
then    ADD r4, r4, #1
    B   exit
ace ADD r1, r1, #1
    MOV r4, #11
    B   exit
jqk MOV r4, #10
exit    MOV r0, r4
    ENDP
I've written these assembly codes, and I've adapted them to inline grammar. reference : Labels in GCC inline assembly
int calc(int num, int *cnt)
{
    int rst=0;
    int c = *cnt;
    __asm volatile("MOV R0, %0": :"r"(num));
    __asm volatile("AND R0, R0, %0": :"r"(0x12));
    __asm volatile("MOV R1, %0": :"r"(c));
    __asm volatile("CMP R0, #0");
    __asm volatile("BEQ ace%=");
    __asm volatile("CMP R0,#8");
    __asm volatile("BGT jqk%=");
    __asm volatile("ADD R2, R0, #1");
    __asm volatile("B exit%=");
    __asm volatile("ace%=: ADD R1, R1, #1");
    __asm volatile("MOV R2, #11");
    __asm volatile("B exit%=");
    __asm volatile("jqk%=: MOV R2, #10");
    __asm volatile("exit%=: LDR %0, R2":"=r"(rst):);
    __asm volatile("LDR %0, R1":"=r"(c):);
    __asm volatile("POP {R0, R1, R2}");
    *cnt = c;
    return rst;
}
But even in this case, an error appears. What should I change in my code?
'''
int calc(int num, int *cnt)
{
    int tmp = num % 13;
    if (tmp == 0)
    {
        tmp = *cnt;
        *cnt = tmp+1;
        return 11;
    }
    else if (tmp > 8)
        return 10;
    else
        return tmp + 1;
}
'''
 
    