Forum: Compiler & IDEs Library in Assembler


von HendrikHoelscher (Gast)


Lesenswert?

Moin :-)

Nachdem ich mich in letzter Zeit verstärkt um meine DMX-'Tuts'
gekümmert habe und zZ. an einer etwas besseren LCD-Ausgabe werkel, hat
sich folgendes Problem herauskristallisiert:
Sehr viele scheinen sich überhaupt nicht um den Code selbst zu scheren,
lesen die Erläuterungen nicht sondern klatschen irgendwelche Module aus
dem Netz (-> Codesammlung ist da sehr beliebt...) wild zusammen. Am
Ende Ärgern sie sich, dass es nicht so werkelt wie gewünscht. Wenig
später findet man Posts à la: 'Alles Scheiße - funzt net! Wer hat noch
Probleme?'

Darum würde ich nun gerne mit Libraries anfangen. Etwas weniger schnell
- aber narrensicher. Aus Performancegründen müsste ein großer Teil in
Assembler geschrieben werden.

Nun zu meinen Fragen:
Kann man eine ASM-Lib so schreiben, dass man sie sowohl in C- als auch
asm-Projekte einbinden kann? (WinAVR-asm ist scheinbar nicht ganz mit
dem AVR-Studio-asm kompatibel...)

Wie funktionieren solche eleganten Aufrufe mit Parametern?
'ergebnis = mul(var1,var2)' Werden die vars vor dem Aufruf auf den
Stack gepushed und dann von meiner Lib wieder runter gepopt?

Es wäre wirklich nett, wenn Ihr mir helfen könntet, einen nettes
Werkzeugkästchen für den Transceiver zu basteln.

Viele Grüße, Hendrik
( www.hoelscher-hi.de/hendrik/light/asm.htm )

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Aus Performancegründen müsste ein großer Teil in Assembler
> geschrieben werden.

Beweise, bitte.

> Kann man eine ASM-Lib so schreiben, dass man sie sowohl in C- als
> auch asm-Projekte einbinden kann?

Ja.

> Wie funktionieren solche eleganten Aufrufe mit Parametern?

Hmm, hast du denn wenigstens mal die avr-libc-FAQ gelesen?

Dort steht's drin...  Wenn du WinAVR hast, liegt das alles auf deiner
Platte rum.

von HendrikHoelscher (Gast)


Lesenswert?

Zitat HomerS.: 'NEIN!'
Habe online bei WinAVR gesucht - auf meine Platte bin ich grade nicht
gekommen...

Zur Performance:
Du hattest mir damals bei dem DMX-Empfang in C geholfen. nach Deinen
Optimierungen lagen wir immer noch bei 7-8µs ggü. 3-4µs in asm. Du
selbst meintest, in diesem Fall einen ASM-include zu bevorzugen.

>> Kann man eine ASM-Lib so schreiben, dass man sie sowohl in C- als
>> auch asm-Projekte einbinden kann?

> Ja.

Bei einer derart informativen Antwort müsssen sich wohl wahre Schätze
auf meiner Platte befinden g

Viele Grüße, Hendrik

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Du hattest mir damals bei dem DMX-Empfang in C geholfen. nach Deinen
> Optimierungen lagen wir immer noch bei 7-8µs ggü. 3-4µs in asm. Du
> selbst meintest, in diesem Fall einen ASM-include zu bevorzugen.

Nu ja, war mir nicht mehr in Erinnerung.  Klar, wenn du so'n knappes
Timing brauchst, wird das wohl nicht anders helfen.

>> Ja.

> Bei einer derart informativen Antwort müsssen sich wohl wahre
> Schätze auf meiner Platte befinden *g*

Das ist ganz einfach: du musst es eh' C-kompatibel schreiben (d.h.
dich an die register conventions halten).  asm-kompatibel ist es ja in
jedem Falle, da der Aufrufer beim Assemblercode jederzeit in der Lage
ist, sich an beliebige Übergabekonventionen zu halten.  Alles, was du
dafür tun kannst ist, das ordentlich zu dokumentieren.

von HendrikHoelscher (Gast)


Lesenswert?

habe grade mal wegen der C-Integration das neue AVR-Studio gezogen.

Das Teil verwendet ja einen völlig neuen assembler (AVRASM2)?!? Na gut
- jetzt habe ich wirklich was zu tun...

Hendrik

von HendrikHoelscher (Gast)


Lesenswert?

So - habe mir jetzt die call conventions rausgepickt:

zu übergebene Argumente:
- nur gradzahlige register
- r25 -> r8 (wobei r25 nur mäßig gradzahlig ist...)

return val:
- 8bit: r24
-16bit: r25:r24

Ich habe zu definieren mit #define test r1
(frisst auch das AVR-Studio so)

Muss SREG puffern sowie sämtliche Register, mit denen ich arbeite -
wenn ich sie mir nicht fest gekrallt habe.

Ist das soweit korrekt?

Grüße, Hendrik (der noch von dem libc-Mörderpdf alles doppelt sieht
g)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> zu übergebene Argumente:
> - nur gradzahlige register
> - r25 -> r8 (wobei r25 nur mäßig gradzahlig ist...)

r25 ist ja auch der high-Teil des ersten Arguments falls das 16 bits
(oder mehr) ist.  Falls das nur 8 bits sind, bleibt r25 einfach
unberührt.

> Ich habe zu definieren mit #define test r1
> (frisst auch das AVR-Studio so)

Ja, das dürfte der portabelste Weg sein.

Warum willst du unbedingt den Atmel-Assembler benutzen können?  Ich
denke, da kommst du nicht um Portabilitäts-#ifdefs herum, da beide
Assembler ziemlich unterschiedliche pseudo-ops benutzen.

Im GNU-Assembler brauchst du mindestens noch:

.global foo
foo:
...

am Anfang deiner Funktion "foo".

> Muss SREG puffern sowie sämtliche Register, mit denen ich arbeite -
> wenn ich sie mir nicht fest gekrallt habe.

Nein.  Um SREG musst du dich nicht weiter kümmern.  Alle "call-used
registers" musst du nicht retten, also r18...r27 und r30/r31 kannst
du
frei benutzen, außerdem r0 (auch als tmp_reg bezeichnet).

Die anderen Register musst du retten.  r1 darfst du als Quelle für die
Konstante 0 benutzen (und solltest es sinnvollerweise auch auf diesem
Wert belassen).

Alle Register + SREG muss man nur im Interruptkontext retten.

> Hendrik (der noch von dem libc-Mörderpdf alles doppelt sieht g)

Gibt's doch auch als HTML.

von ObjectFile Format Hinterfrager (Gast)


Lesenswert?

Kommt denn der avr-ld überhaupt mit den vom AVRASM erzeugten Object
Files zurecht?

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.