Forum: Compiler & IDEs Error: bad instruction `lsl r3,r0,#2' GCC/ Assembler


von Weser (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich habe ein Problem, und zwar habe ich unter ubuntu Eclipse mit openocd 
und arm-elf-gcc (GCC) 4.1.0 am laufen. Jetzt habe ich ein Prgramm 
geschrieben, welches ein einfaches Display ansteuern sollte, und die 
Display.c einbinden sollte. Das hat auch alles gut geklappt, bis dann 
beim Compilieren der folgende Fehler auftrat:


Compiling C: display.c
arm-elf-gcc -c  -mcpu=arm7tdmi  -I. -gdwarf-2 -DROM_RUN -D__WinARM__ 
-O0 -Wall -Wcast-align -Wimplicit  -Wpointer-arith -Wswitch 
-Wredundant-decls -Wreturn-type -Wshadow -Wunused 
-Wa,-adhlns=display.lst  -Iinclude/ -MD -MP -MF .dep/display.o.d 
-Wnested-externs  -std=gnu99 display.c -o display.o
/tmp/ccngc6wm.s: Assembler messages:
/tmp/ccngc6wm.s:22: Error: bad instruction `lsl r3,r0,#2'
make: *** [display.o] Fehler 1


In der Display.c Datei ist das diese Stelle:


//**************************************************************
// delay1us(uiK) verzögert um uiK * 1us bei MCK=24Hz
// uiK <= 1.073.741.823 us = 17,8957 sec
//**************************************************************
_attribute_ ((naked)) void delay1us(unsigned int uiK){

  asm("      lsl  r3, r0, #2  \n\t" // Multi *4
    "Label:    cmp  r3, #0    \n\t"    //1
    "    beq  Ende          \n\t"    //2
    "    sub  r3, r3, #1      \n\t"    //1
    "    b  Label          \n\t"    //2
    "Ende:    mov  pc, lr    \n\t");
}


Nun weiß ich nicht genau woran es liegt. Bitte um Hilfe. Danke

von Kai S. (zigzeg)


Lesenswert?

Versuch vielleicht mal MOV, statt LSL.
Es gibt auf ARM keine native LSL instruction da jede ALU operation ein 
LSL auf einem Operanden machen kann. Kann hoechstens sein dass manche 
Assembler es als Alias zulaesst. Vgl. ADR.

ZigZeg

Edit: Seh gerade, im Thumb mode gibt es LSL. Vielleicht wird das nicht 
als Thumb assembliert ?

von (prx) A. K. (prx)


Lesenswert?

Kai S. schrieb:
> Es gibt auf ARM keine native LSL instruction da jede ALU operation ein
> LSL auf einem Operanden machen kann. Kann hoechstens sein dass manche
> Assembler es als Alias zulaesst. Vgl. ADR.

Als ARM den Thumb(-2?) Befehssatz rausbrachte haben sie auch eine 
Assembler-Notation definiert, die gemeinsame Befehle in der gleichen 
Weise schreibt. In dieser "Unified Assembly Language" Variante existiert 
auch die LSL Schreibweise.

von Weser (Gast)


Lesenswert?

okay ich bin der Sprache Assembler noch nicht so mächtig, hat wer eine 
Idee wie man es sonst schreiben könnte?

von Weser (Gast)


Lesenswert?

okay es funktioniert , wenn man

mov r3,r0, lsl #2

eingegeben hat. Ich danke euch.

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.