Gast
#792291
Hallo,
aus einem C-Programm möchte ich eine Assemblerroutine aufrufen.
Wie komme ich in der Assemblerroutine an die Grösse von arr1?
C:
extern void ARRMULT(void);
int arr1[]={10,20,30,40};
int arr2[]={45,35,25,15};
unsigned int arrsize=sizeof(arr1)/sizeof(int);
void main(void)
{
ARRMULT();
}
Assembler:
.GLB _ARRMULT
.GLB _arr1
.GLB _arr2
.GLB _arrsize
.SECTION program
_ARRMULT:
mov.w #0,r0 ; summe arr1[i]*arr2[i] fuer arrsize elemente
mov.w #0,r1 ; summe in r2..r0
mov.w #0,r2
mov.w _arrsize,r3
mov.w #_arr1,A0
mov.w #_arr2,A1
rmpa.w
rts
Der Umweg über die Variable arrsize funktioniert zwar, ist aber unschön.
Die Renesasdokumentation zu Compiler und Assembler ist da auch nicht
besonders hilfreich.
Ein
mov.w # SIZEOF _arr1 , r3
wird mit:
Error (asp30): Section name is missing '_arr1' angemeckert.
Die diversen Sections hab ich auch schon mal durchprobiert.
Als Workaround tut ein:
mov.w #(_arr2-_arr1)/2,r3
Jemand einen Rat? Der Linker müßte die Grösse ja eigentlich kennen.