Forum: Compiler & IDEs ASM mit libc verlinken


von Michael A. (micha54)


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

von Oliver (Gast)


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

von Michael A. (micha54)


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

von Stefan E. (sternst)


Lesenswert?

Michael Appelt schrieb:
> In .asm geht .MACRO:
>
> ...
>
> In .S dagegen geht nur #define wie im C-Programm.

Unsinn.

http://sourceware.org/binutils/docs/as/Macro.html#Macro

von Michael A. (micha54)


Lesenswert?

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 ?

von Stefan E. (sternst)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Michael Appelt schrieb:
> Allerdings kann ich keine Register als Parameter angeben, ich bekomme
> dann "Error: constant value required".

Beispiel?

von Michael A. (micha54)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

1
.macro pushw p1, p2
2
  ST    -Y,\p1
3
  ST    -Y,\p2
4
.endm

von Michael A. (micha54)


Lesenswert?

:-)))

Danke vielmals,

das hatte ich sogar gelesen, aber nicht richtig verstanden.

Gruß,
Michael

von Johann L. (gjlayde) Benutzerseite


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

von Michael A. (micha54)


Lesenswert?

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

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.