Forum: Compiler & IDEs GCC Übergabe-Parameter zu Assemblerfunktion


von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Moin,
Kann mir jemand sagen welche Parameter in welchen (Pseudo-)Registern
der AVR-GCC an eine Assemblerfunktion übergibt.
rP1 scheint nicht mehr zu funktionieren.

Wolf

von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Ist erledigt stand in der FAQ vom AVR-GCC
R24 und R25 beim 1. Argument.

Sorry
Wolf

von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Heute geht auch plötzlich die Definition von rP0 und rTI0 wieder. Am
Sonntag hat der gas laufend gemeckert rP0 müßte kleiner als 31 sein.
Keine Ahnung warum, ich hatte keine Änderungen gemacht.

Wolf

von mthomas (Gast)


Lesenswert?

Sich darauf zu verlassen, dass die Parameter immer bestimmten Registern
zugewiesen werden raecht sich moeglicherweise mal wenn jemand am
Compiler rumbastelt. Nur als Vorschlag: Inline-Assembler verwenden,
damit kann man die Parameter "mit Namen ansprechen". In der
avrlibc-Dokumentation gibt es Information dazu und in der boot.h-Datei
kann man sich auch einiges abschauen.

von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Klar, wenn der Compiler das Layout verändert kann man das so nicht
portabel halten. Ich schau mir mal die boot.h an. Allerdings stammen
die ctoasm.inc und die macros.inc die ich verwendet habe ja auch aus
der avrlib.

Grüße
Wolf

von Jörg Wunsch (Gast)


Lesenswert?

avrlib != avr-libc

ctoasm.inc und macros.inc sind kein offizieller Bestandteil der
avr-libc.

von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Jörg, das wundert mich nun aber denn die Files stammen aus der avr-libc.
Sie werden nicht mit installiert, das ist richtig.
Ich meinte natürlich die avr-libc. Sri für die Ungenauigkeit

Grüße
Wolf

von Jörg Wunsch (Gast)


Lesenswert?

Richtig, die werden nicht mitinstalliert.  Früher wurden sie, aber mit
dem Umzug des avr-libc Codes nach savannah.nongnu.org hat sich Marek
Michalkiewicz damals entschlossen, diese Dateien nicht mehr öffentlich
zugänglich zu machen.  Sie sind noch da, weil einiger alter Code sie
intern benutzt.  Ein offizielles Interface in irgendeiner Form stellen
sie aber nicht dar.

Ich könnte mir vorstellen, daß man bestimmte Teile von macros.inc
öffentlich zur Verfügung stellt (vor allem die Dinge wie XJMP/XCALL
etc.), während ich bei ctoasm.inc eher geneigt bin zu sagen, daß diese
Makros den Code sinnlos verschleiern.  (Besonders kraß ist mir das in
die Nase gestiegen bei Debuggen von Teilen der fplib, bei der dann
fplib.inc die Dinge noch weiter undurchschaubar macht.)

Wenn Du selbst in einer Assemblerfunktion Namen für die Parameter
vergeben willst, dann mach sie gleich passend zum C-Prototypen.

/*
 * int
 * foobar(int param1, char param2);
 *
 * Calculates the foobar out of param1 and param2.
 */

#define PARAM1 24
#define PARAM2 22

#define TMPREG1 20

#define ZERO r1

#define RETVAL 24

        .text

        mov     TMPREG1, PARAM1
        mov     TMPREG1 + 1, PARAM1 + 1
        clc
        clr     ZERO
        ror     TMPREG1
        ror     TMPREG1 + 1
        add     TMPREG1, PARAM2
        adc     TMPREG1, ZERO
        movw    RETVAL, TMPREG1
        ret

von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Jörg, das Selbstdefinieren von Registern wollte ich eigentlich
vermeiden. Wenn der GCC mal das Übergabeschema ändert muß ich ja wieder
alles ändern. Oder sehe ich das völlig falsch?

Grüße
Wolf

von Jörg Wunsch (Gast)


Lesenswert?

Ich denke nicht, daß das in den nächsten Jahren passieren wird. ;-)

Zumindest nicht ohne vorherige ausgiebige Diskussion auf der avr-libc
Entwicklerliste -- dort wäre nämlich dann einiges zu tun.

Das Schema ist im avr-gcc ein einziges Mal bislang geändert worden und
das nur, damit der CPU-Kern der ATmegas mit seinen MOVW-Befehlen
besser ausgenutzt werden kann.

Wie geschrieben: es gibt derzeit keinen besseren Weg.  Es gibt keine
offizielle Headerdatei, in der Du diese Information authoritativ
abgreifen könntest.  ctoasm.inc ist nicht offiziell, und die
Wahrscheinlichkeit, daß diese Datei mal komplett verschwindet, ist
größer als die, daß sich das Registerschema im avr-gcc ändert.

von Wolf-Ruediger Juergens (Gast)


Lesenswert?

Ok, Jörg, die Begründung leuchtet mir ein.

Schöne Ostern
Wolf

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.