avr-as macro programmierung

OP #2817905
Lesenswert?

#define    RU1      r18

        poweronreset:           .byte 1

.macro store p0 p1 p2
        ldi     /p1 , /p2
        sts     /p0 , /p1
.endm

        store   poweronreset , RU1 , 13


avr.asm: Assembler messages:
avr.asm:10: Error: bad expression
avr.asm:10: Error: register number above 15 required
avr.asm:10: Error: `,' required
avr.asm:10: Error: garbage at end of line
avr.asm:10: Error: bad expression
avr.asm:10: Error: `,' required
avr.asm:10: Error: constant value required
avr.asm:10: Warning: skipping two-word instruction
avr.asm:10: Error: garbage at end of line

Was muss hier geändert werden, damit es läuft?
Gast #2817975
Lesenswert?

Also, jetzt mal selbst probiert.

Der Code:
1
#define RU1 r18
2
        poweronreset:           .byte 1
3

4
.macro store p0 p1 p2
5
        ldi     \p1 , \p2
6
        sts     \p0 , \p1
7
.endm
8

9
        store   poweronreset , RU1 , 13

wird fehlerfrei übersetzt in:

 8cd:  2d e0         ldi  r18, 0x0D  ; 13
 8cf:  20 93 cc 08   sts  0x0088, r18



Volker
Gast #2818019
Lesenswert?

Der Macro-Syntax nach zu urteilen müsste das der gcc sein.

Ended der Name der Assemblerdatei auf .S? Sonst läuft die u.U. nicht 
durch den Precompiler und dann werden die Defs nicht ausgewertet.

Volker
#2818554
Lesenswert?

Rainer S. schrieb:
> Ich brauche aber nur den Assembler...

Offenbar ja nicht, denn du willst ja auch den Präprozessor haben. Und 
wenn du mit dem vom Assembler produzierten Output irgendetwas anfangen 
willst, dann brauchst du auch noch den Linker hinterher.

Rainer S. schrieb:
> Geht das nicht auch ohne GCC?

Klar, dann musst du eben alles selber aufrufen (Präprozessor vorher, 
Linker hinterher), mit den richtigen Optionen, dazu noch ein 
Linker-Script selber schreiben (obwohl es im einfachsten Fall vielleicht 
auch ohne Linker-Script geht).
OP #2818583
Lesenswert?

Stefan Ernst schrieb:
> Rainer S. schrieb:
>> Ich brauche aber nur den Assembler...
>
> Offenbar ja nicht, denn du willst ja auch den Präprozessor haben.

Keine Ahnung was jetzt ein Präprozessor ist...
Hatte gedacht, es wäre (relativ) einfach vom Atmel-Assembler auf den 
avr-as umzusteigen.
avr-gcc ist bei den Binutils nicht dabei. Habe ich versucht aufzurufen.

> Und
> wenn du mit dem vom Assembler produzierten Output irgendetwas anfangen
> willst, dann brauchst du auch noch den Linker hinterher.

Aha.

> Rainer S. schrieb:
>> Geht das nicht auch ohne GCC?
>
> Klar, dann musst du eben alles selber aufrufen (Präprozessor vorher,
> Linker hinterher), mit den richtigen Optionen, dazu noch ein
> Linker-Script selber schreiben (obwohl es im einfachsten Fall vielleicht
> auch ohne Linker-Script geht).

Ist das denn relativ einfach möglich, oder soll ich das lieber weiter 
mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.
(Firma: guloshop.de) #2818674
Lesenswert?

Rainer S. schrieb:
> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.

Warum nimmst du nicht den Assembler "avra"? Er ist meistens in den 
Linux-Paketen enthalten.

Soweit ich mich erinnere, ist avra zum Atmel-Assembler kompatibel. Er 
besitzt sogar ein paar nützliche Erweiterungen.
Persönliche Seite #2818701
Lesenswert?

Rainer S. schrieb:
> Stefan Ernst schrieb:
>> Rainer S. schrieb:
>>> Ich brauche aber nur den Assembler...
>>
>> Offenbar ja nicht, denn du willst ja auch den Präprozessor haben.
>
> Keine Ahnung was jetzt ein Präprozessor ist...

Das ist das Ding, das #define und Konsorten auflöst.

Wenn du keinen Präprozessor verwenden willst/kannst/darfst, dann 
beschränke dich auf .macro und .altmacro, d.h. die 
Makro-Syntak/-Semantik von gas anstatt der von cpp.

> Hatte gedacht, es wäre (relativ) einfach vom Atmel-Assembler auf den
> avr-as umzusteigen.
> avr-gcc ist bei den Binutils nicht dabei. Habe ich versucht aufzurufen.

Wer installiert denn avr-binutils ohne avr-gcc?

> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.

avr-gcc/avr-as ist nicht kompliziert, aber in der Verwendung eben etwas 
anders als der Atmel-Assembler.  Dafür ist der GNU-Assembler 
leistungsfähiger.
OP #2818784
Lesenswert?

Markus W. schrieb:
> Rainer S. schrieb:
>> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
>> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.
>
> Warum nimmst du nicht den Assembler "avra"? Er ist meistens in den
> Linux-Paketen enthalten.

Kannte ich bis jetzt nicht. Probiere ich vielleicht mal aus.
Auf der Seite steht, dass er kompatibel zum Atmel Assembler ist.

Johann L. schrieb:
> Wenn du keinen Präprozessor verwenden willst/kannst/darfst, dann
> beschränke dich auf .macro und .altmacro, d.h. die
> Makro-Syntak/-Semantik von gas anstatt der von cpp.

Das hört sich kompliziert an...

>> Hatte gedacht, es wäre (relativ) einfach vom Atmel-Assembler auf den
>> avr-as umzusteigen.
>> avr-gcc ist bei den Binutils nicht dabei. Habe ich versucht aufzurufen.
>
> Wer installiert denn avr-binutils ohne avr-gcc?

In dem binutils Download ist auch arm-as und arm-ld drin, den ich für 
einen Freepascal Crosscompiler benötige.
Da habe ich dann eben auch avr-as probiert.

>> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
>> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.
>
> avr-gcc/avr-as ist nicht kompliziert, aber in der Verwendung eben etwas
> anders als der Atmel-Assembler.  Dafür ist der GNU-Assembler
> leistungsfähiger.

Warum ist der denn leistungsfähiger?
Gast #2818803
Lesenswert?

Versuch's mal in der Richtung:
1
#include "avr/io.h"
2
#include "GLCD_ISR_defs.h"
3

4
.extern scr_ln_nr      ; unsigned char, number 0..19 of screen line
5
.extern text        ; unsigned char [20][40], holds screen text
6
.extern p_text        ; pointer to actual text position
7
.extern  schrift        ; const unsigned char schrift[12][256] PROGMEM, font
8
.global TIMER0_OVF_vect
9
.equ  set_cp,   16    ; register for CP set constant
10
.equ  ch_ln_ctr,   17    ; char scan line ctr
11
.equ  scr_ln_ctr, 18    ; screen line ctr in
12
.equ  clr_cp,   19    ; register for CP clear constant
13
.equ  schrift_lb, 22    ; backup register for address lowbyte of schrift
14
.equ  schrift_hb, 23    ; backup register for address highbyte of schrift
15
.equ  tmp,     24
16
.equ  xl,     26
17
.equ  xh,     27
18
.equ  zl,     30
19
.equ  zh,     31
Da sind auch noch Anweisungen drin um auf in C deklarierte Variablen 
zuzugreifen.

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