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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren