ASM mit libc verlinken

OP #2386168
Lesenswert?

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
Gast #2386179
Lesenswert?

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
OP #2386233
Lesenswert?

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
#2386487
Lesenswert?

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.
Persönliche Seite #2386610
Lesenswert?

Stefan Ernst schrieb:
1
.macro pushw p1, p2
2
>   ST    -Y,\p1
3
>   ST    -Y,\p2
4
> .endm

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
1
mov 1,2
2
add 3,4

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