Forum: Compiler & IDEs AVR-GCC Assembler, Programm- & Byteadresse


von Jokel (Gast)


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)

von Karl M. (Gast)


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>)

von Stefan E. (sternst)


Lesenswert?

1
hi8(pm(status0_adr))

von Jokel (Gast)


Lesenswert?

Stefan E. schrieb:

>
1
hi8(pm(status0_adr))

Produziert 3 Fehlermeldungen:

-
Error `)' required
Error unaligned opcodes detected in executable segment
Error junk at end of line, first unrecognized character is `('

von Johann L. (gjlayde) Benutzerseite


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

: Bearbeitet durch User
von Jokel (Gast)


Lesenswert?

Vielen Dank, Johann.

Mit .word pm(status0) funktioniert es.

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.