ARM7: Kann keine Konstante in Register schreiben?

Gast #1036121
Lesenswert?
• ▲
▼
Hallo,

Beim lpc2387 konnte ich mit folgendem Code den VIC anspringen:
1
...
2
    mov    r0, #0xffffff00    /* lpc23xx */
3

4
/*    mov    r0, #0xfffffF030     /* lpc214x */
5

6
    ldr    r0, [r0]
7
    add    lr,pc,#4
8
    mov     pc, r0
9
...

Beim lpc2148 ist die VIC-Adresse nicht 0xffffff00, sondern 0xffffff030. 
Diese Konstante mag aber der Assembler nicht:

[...]
common.s: Assembler messages:
common.s:140: Error: invalid constant (fffff030) after fixup
[...]

Hat jemand eine Idee? Sollte ich nicht jeden Wert in das Register 
schreiben können?

Ich benutze gcc version 4.3.1 mit GNU assembler version 2.18.

Danke im Vorraus,
Kaspar
#1036134
Lesenswert?
• ▲
▼
Bei ALU Befehlen ist nur eine rotierte 8bit Konstante möglich. 
0xfffff030 past nicht in dieses Schema.

Bei LDR allerdings sind +/-12bit Offset möglich, und daher lässt sich 
diese Adresse innerhalb der ersten zig Bytes vom Flash per LDR direkt 
PC-relativ adressieren:
    ldr r0,[pc,#-...]
Oder eben so von überall her:
    mov r0,#0
    ldr r0,[r0,#0xfffff030]
Gast #1037032
Lesenswert?
• ▲
▼
Danke für die schnellen Antworten!

Die Fehlermeldung kam natürlich auch mit der richtigen Anzahl F's.

Ich hab das Problem jetz mit rumrechnen gelöst, allerdings würde ich 
natürlich gerne die Instruktion in der Interruptroutine sparen...
Persönliche Seite #1037113
Lesenswert?
• ▲
▼
Kaspar Schleiser wrote:
> Ich hab das Problem jetz mit rumrechnen gelöst, allerdings würde ich
> natürlich gerne die Instruktion in der Interruptroutine sparen...

Am einfachsten ist es, die Pseudo Instruktion "LDR rn, =<const>" zu 
verwenden. Dann nimmt Dir der Assembler das Rechnen ab.
1
.equ VicVectAddr, 0xFFFFF030
2

3
ldr r0, =VicVectAddr
4
add lr,pc,#4
5
mov pc, r0

Gruß
Marcus
#1038969
Lesenswert?
• ▲
▼
Marcus Harnisch wrote:
> Am einfachsten ist es, die Pseudo Instruktion "LDR rn, =<const>" zu
> verwenden. Dann nimmt Dir der Assembler das Rechnen ab.
>
>
1
> .equ VicVectAddr, 0xFFFFF030
2
> 
3
> ldr r0, =VicVectAddr
4
>
Daraus macht der Assembler:
1
ac:   e59f0048        ldr     r0, [pc, #72]   ; fc <switch_context_int+0xc>

Sonst habe ich ein MVN und ein SUB. ldr sieht schöner aus, braucht aber 
3 Takte, mvn und sub jeweils nur einen, oder nicht?

Gruß
Kaspar

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.