AVR-GCC Assembler, Programm- & Byteadresse

Gast #4850269
Lesenswert?
• ▲
▼
Der GCC-Assembler liefert mit hi8(status0_adr) die Byteadresse des 
Labels. Für meine Zwecke wird jedoch die Programmadresse benötigt.

Versucht habe ich:
1
.byte pm_hi8(status0_adr)

1
.byte pm(hi8(status0_adr))

Beide mit der Fehlermeldung:
junk at end of line, first unrecognized character is `('

Ebenso funktionieren arithmetische Operationen nicht:
1
.byte hi8(status0_adr / 2)

invalid operands (.text and ABS sections) for `/'



Was muss ich tun, um aus einem Label die Programmadresse zu erhalten?


1
...
2

3
status0_adr:
4

5

6
 RJMP StatusLoop  
7

8
...
9

10
.text
11
.align 8
12
atatus:
13
.byte hi8(status0_adr), lo8(status0_adr)
14
.byte hi8(status2_adr), lo8(status2_adr)
Gast #4850395
Lesenswert?
• ▲
▼
Hallo,

wenn es sich um eine Adresse im Flash handelt, dann sind diese, wie im 
Datenblatt eines Atmel AVR 8Bit zu lesen ist, an Wordadressen 
ausgerichtet.
Somit muss mal mit meinem Compiler/ Assembler schreiben:
1
; bei 24Bit Pointer im Flash!
2
ldi _R16,byte1(2*<label>)
3
ldi _R17,byte2(2*<label>)
4
ldi _R18,byte3(2*<label>)
Persönliche Seite #4850533
Lesenswert?
• ▲
▼
Falls es Linker Stubs braucht, Word-Adresse:
1
.word gs(symbol)
ansonsten, Word-Adresse:
1
.word pm(symbol)
Einzelne Bytes der Word-Adresse laden geht nur im Code, aber nicht für 
Daten:
1
    ldi r16, pm_lo8(symbol)
2
    ldi r17, pm_hi8(symbol)
3
    ldi r18, pm_hh8(symbol)
4

5
    ldi r20, lo8(gs(symbol))
6
    ldi r21, hi8(gs(symbol))
Und für die Byte-Adresse:
1
    .byte lo8(symbol)
2
    .byte hi8(symbol)
3
    .byte hh8(symbol)
4
    .balign 2

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