Forum: Compiler & IDEs GCC Assembler interpretiert .org falsch


von Joachim .. (joachim_01)


Lesenswert?

Moin, ich hab hier die größten Probs mit dem GCC Assembler, Probleme die 
eigenlich gar keine sein dürften.
Hier zB funktioniert .org nicht. Ich setze zum testen .org auf 0x110
1
    STS  CLKPR,R25  ;enable updating of CLKPR            
2
    STS  CLKPR,R24  ;write the new value
3
    ret        ;
4
5
.org  0x110
6
.global add_two
7
  add_two:
8
    ADD R24,R22    ;val_1 = val_1 + val_2
9
    CLR  R25      ;return val_1
10
    ret        ;

Und das kommt dabei heraus:
1
  fa:  90 e8         ldi  r25, 0x80  ; 128
2
    STS  CLKPR,R25  ;enable updating of CLKPR            
3
  fc:  90 93 61 00   sts  0x0061, r25
4
    STS  CLKPR,R24  ;write the new value
5
 100:  80 93 61 00   sts  0x0061, r24
6
    ret        ;
7
 104:  08 95         ret
8
  ...
9
10
0000020a <add_two>:
11
12
.org  0x110
13
.global add_two
14
  add_two:
15
    ADD R24,R22    ;val_1 = val_1 + val_2
16
 20a:  86 0f         add  r24, r22
17
    CLR  R25      ;return val_1
18
 20c:  99 27         eor  r25, r25
19
    ret        ;
20
 20e:  08 95         ret



Die org. Zuweisung wird einfach falsch ausgeführt.
Wie kommt das? Ist ein Ändern der Bereichsadresse nicht erlaubt?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Doku:

>> .org may only increase the location counter, or leave
>> it unchanged; you cannot use .org to move the location
>> counter backwards.

von Stefan E. (sternst)


Lesenswert?

Joachim ... schrieb:
> Die org. Zuweisung wird einfach falsch ausgeführt.

Nö, nur anders als du denkst.
Das liegt in erster Linie daran, dass mehrere Module zusammen gelinkt 
werden. Verabschiede dich einfach von dem Gedanken, feste Adressen per 
“org“ vorzugeben. Warun willst du das übethaupt?

von Joachim .. (joachim_01)


Lesenswert?

>> .org may only increase the location counter, or leave
>> it unchanged; you cannot use .org to move the location
>> counter backwards.
Hmmmnja.. aber ich zähl doch gar nicht rückwärts, oder?


>Warun willst du das übethaupt?
Ziel:
Hab hiern ATMega mit 16MHz der via CTC mit TCNT2=7 1MHz am OC2A ausgibt. 
Gleichzeitig möche ich TCNT2 beobachten um die Flankenumschaltung zu 
erkennen. Kurz danach schalte ich nen Ausgang.

Der Code liest über TCNT2 als Zähler quasi parallel NOPs aus ner Tabelle 
mit um damit das ganze zu synchronisieren. Um zu verhindern daas die 
Tabelle (hat sieben NOPs) aber an nem Seitenübergang liegt will ich sie 
fest anlegen.

von Hmm (Gast)


Lesenswert?

Es geht hier nicht um das "zählen" sondern inkrementieren resp. 
dekrementieren.
Und letzteres liegt hier vor.
Du bist bei Adresse 20a

0000020a <add_two>:

und willst wieder zurück nach 110

.org  0x110

von Stefan E. (sternst)


Lesenswert?

Joachim ... schrieb:
> Um zu verhindern daas die
> Tabelle (hat sieben NOPs) aber an nem Seitenübergang liegt

Dann konsultiere die Doku zum Thema “Alignment“.

von Joachim .. (joachim_01)


Lesenswert?

Mach ich. Danke.

von Joachim .. (joachim_01)


Lesenswert?

>und willst wieder zurück nach 110

>.org  0x110


Ach so! Deshalb sehe ich zB Tabellen oder Ascii-Text immer irgendwo am 
Ende des Speichers angelegt...? Yep. Das würd dann natürlich keinen Sinn 
machen. Grummel.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Geht doch einfach so:
1
#define __SFR_OFFSET 0
2
#include <avr/io.h>
3
4
.global main
5
main:
6
    in      r30, TCNT2
7
    lsl     r30
8
    clr     r31
9
    subi    r30, lo8(-(gs(.nops)))
10
    sbci    r31, hi8(-(gs(.nops)))
11
    ijmp 
12
13
.nops:
14
    .rept 7
15
    nop
16
    .endr
17
18
    ret

von Joachim .. (joachim_01)


Lesenswert?

.align 8 startet bei 0x200
.align 7 startet bei 0x180

Genau nach Plan. Klasse!
Und Johanns Code probier ich auch noch... aber nicht mehr heute.

N8.

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.