Forum: Mikrocontroller und Digitale Elektronik R8C/NC30 externes SIZEOF?


von Ratloser (Gast)


Lesenswert?

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.

von Ratloser (Gast)


Lesenswert?

Gefunden :-)

      mov.w #.LEN{'arr1'},r3

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.