GCC Übergabe-Parameter zu Assemblerfunktion

Gast #77858
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
Gast #77859
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.
Gast #77860
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
Gast #77862
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
Gast #77863
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
Gast #77864
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
Gast #77865
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.

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