Hallo,
möglicherweise habe ich ein ganz triviales Problem, aber 2 Tage Suche
haben mir bisher nicht geholfen.
Ich will einen pcode-Interpreter für Pascal (und andere) auf einem
(mehreren) ATMEGA162 implementieren. Programmieren des Pcode ist kein
Problem, soll in Assembler erfolgen. Für die Real-Funktionen will ich
die libc anzapfen. Ziel ist ein Multiprozessorsystem zur Demo des
Prinzips.
Lösung 1: gcc-Projekt, interpreter in asm als .S-Datei.
Problem: ich benötige mehrzeilige Makros, bekomme das mit den #define
aber nicht hin. Für einen Real-Zugriff will ich z.B. 7 asm-Befehle incl.
einer Warteschleife auf bus-acknowledge ablaufen lassen.
Lösung 2: asm-Projekt, interpreter als .asm
Problem: wo gebe ich an, daß die libc hinzuzulinken ist ?
Lösung 3: gcc-Projekt mit inline-ASM
Problem: bei dem Umfang ist der Code praktisch nicht mehr lesbar.
Kann mir einer bei L1 (oder L2) eine Tip geben ?
Gruß,
Michael
Ich verstehe 1. und 2. nicht.
Was genau meinst du mit mehrzeiligen #defines in einer .S-Datei, und was
ist der Unterschied zu einer .asm-Datei?
Wenn du mit .asm-Dateien Quelldateien für den Atmel-Assmebler meinst,
der lääst sich nicht mit gcc-objekten zusammenlinken. Das geht damit gar
nicht.
Oliver
Hallo Oliver,
die S-Datei im gcc-Projekt enthält echte asm-Befehl ohne die
incline-Schreibweise asm("..."), die Pseudobefehle haben aber eine
andere Syntax als der avr asm von Atmel.
In .asm geht .MACRO:
.MACRO pop2
LD @0,X+
LD @1,X+
.ENDM
In .S dagegen geht nur #define wie im C-Programm.
#define pop1(x0) \
LD x0,X+
ist ok, aber
#define pop2(x0,x1) \
LD x0,X+ \
LD x1,X+
geht halt nicht, Klammerung mit {} und () funktioniert wohl auch nicht.
Für die Lösung 1 mit gcc spricht halt auch, daß ich dann das
Laufzeitsystem (IO+Tasking+Mem) mit C programmieren kann.
Gruß,
Michael
Ok, Danke erstmal, ein wenig geht was.
Allerdings kann ich keine Register als Parameter angeben, ich bekomme
dann "Error: constant value required".
Gruß,
Michael
P.S. Dein Tonfall ist ja erfrischend, heute Frust gehabt ?
Michael Appelt schrieb:> Allerdings kann ich keine Register als Parameter angeben, ich bekomme> dann "Error: constant value required".
Dann hast du wohl irgendetwas falsch gemacht.
Michael Appelt schrieb:> P.S. Dein Tonfall ist ja erfrischend, heute Frust gehabt ?
Nö, aber zuweilen betitle ich Unsinn einfach auch als solchen. Es wäre
was anderes gewesen, wenn du so was wie "ich glaube" oder "soweit ich
weiß" geschrieben hättest, aber du hast es als Tatsache hingestellt, und
somit ist die Aussage schlicht Unsinn.
Hallo,
also
.macro pushw p1, p2
ST -Y,R11
ST -Y,R12
.endm
pushw R11,R12
geht.
.macro pushw p1, p2
ST -Y,p1
ST -Y,p2
.endm
geht nicht, Error wie oben.
Hast Du einen Tip ?
Gruß,
Michael
Wenn wirklich immer ein Word-Register auf den "Stack" soll, also ein
16-Bit Register beginnend mit einer gerader Register-Nummer, dann geht
bequemer auch
1
.macro pushw regno
2
ST -Y,\regno+1
3
ST -Y,\regno
4
.endm
5
6
pushw 2
Denn der GNU-Assembler frisst Zahlen als Registernummer (die Mnemonics
sind eindeutig und lassen diese Zuordnung fehlerfrei zu).
Es geht also auch
Danke, das greife ich gerne auf.
Leider haben die verschiedenen Tools bzw. Ebenen sehr unterschiedliche
Eigenschaften, die Doku ist auch nicht gerade übersichtlich und im Web
mangelt es nicht an falschen oder veralteten Hinweisen.
Gruß,
Michael