Forum: Mikrocontroller und Digitale Elektronik Assemblercode im Microchip-XC16-Compiler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von shitau (Gast)


Lesenswert?

Hallo,

ich bin auf der Suche nach möglichst anschaulichen Beispielen, wie 
Assemblercode beim Microchip XC16-Compiler eingebunden werden kann. 
Theoretische Beschreibungen zu den verschiedenen Möglichkeiten habe ich 
und möchte es nun praktisch versuchen.

Über jeden Hinweis würde ich mich sehr freuen.

: Verschoben durch User
von Peter D. (peda)


Lesenswert?

In der Regel steht sowas im Manual des jeweiligen Compilers. Oftmals 
gibt es in der Compiler-Suite auch ein Example-Verzeichnis mit 
Beispielen.

Assembler mit C zu mixen erfordert fundierte Kenntnisse von beidem, d.h. 
ist nichts für C-Anfänger.
Der Compiler und der Linker haben bestimmte Regeln für die Benutzung von 
Variablen, Registern und Stack, nach denen sich der Assemblercode zu 
richten hat. Daher lassen sich Profis eine Dummy-Funktion in C nach 
Assembler übersetzen und fügen dort ihren Assemblercode ein.

Die Compiler sind heutzutage aber oft so gut, daß es schwer fällt, in 
Assembler effizienteren Code zu schreiben.

: Bearbeitet durch User
von shitau (Gast)


Lesenswert?

Peter D. schrieb:
> In der Regel steht sowas im Manual des jeweiligen Compilers. Oftmals
> gibt es in der Compiler-Suite auch ein Example-Verzeichnis mit
> Beispielen.

Bei den Beispielen handelt es sich i.d.R. um reinen C-Code. Ein richtig 
schönes Beispiel mit eingebundenem Assembler-Code habe ich leider noch 
nicht gefunden und würde mich über einen entsprechenden Hinweis sehr 
freuen.


Peter D. schrieb:
> Die Compiler sind heutzutage aber oft so gut, daß es schwer fällt, in
> Assembler effizienteren Code zu schreiben.

Leider nein, dazu ein einfaches Beispiel:

in C:
delay--;
if (delay == 0) {LATA++; }

in Assembler:
dec    _delay
btsc   SR,#Z
inc    LATA

Übersetzung mit Optimierung 0:
mov.w  delay,w0
dec.w  w0,w0
mov.w  w0,delay
mov.w  delay,w0
cp0.w  w0
bra    nz, 0x000342
mov.w  0x02cd,w0
inc.w  w0,w0
mov.w  w0,0x02c4

Übersetzung mit Optimierung 3:
dec.w  delay,w0
mov.w  w0,delay
bra    nz, 0x000338
inc.w  0x02c4

von Bernd (Gast)


Lesenswert?

Hallo

Schau Dir doch bitte mal die application Note AN1095 (EEPROM emulation) 
von Microchip an. Die ist mit dem XC16 erstellt, der eigentliche Zugriff 
auf die Speicherstellen erfolgt aber in kurzen Assemblerroutinen.

von Peter D. (peda)


Lesenswert?

shitau schrieb:
> Leider nein, dazu ein einfaches Beispiel:
> ..
> Übersetzung mit Optimierung 0:

Was hast Du erwartet, wenn Du die Optimierung absichtlich abschaltest?

shitau schrieb:
> Übersetzung mit Optimierung 3:

Nur ein Befehl mehr wirst Du in der Praxis nicht merken.
Ich meinte mit effizienter, daß die komplette Anwendung spürbar 
schneller wird.

von shitau (Gast)


Lesenswert?

Peter D. schrieb:
> Nur ein Befehl mehr wirst Du in der Praxis nicht merken.
> Ich meinte mit effizienter, daß die komplette Anwendung spürbar
> schneller wird.

Der Code ist immerhin 33% länger.
Bei zeitkritischen Anwendungen oder Speicherknappheit ist das ganz schön 
heftig.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

shitau schrieb:
> dec.w  delay,w0
> mov.w  w0,delay

Könnte es sein, daß Dein handgeklöppelter Assemblercode

> dec    _delay

mit einer anderen Datengröße hantiert?

Der C-Compiler-Output lässt erkennen, daß "delay" ein 16-Bit-Typ ist; 
welches "dec" rufst Du denn in Deinem Assemblercode auf?

Ich kenne den PIC-Assembler-Befehlssatz nicht, aber könnte es sein, daß 
der unterschiedliche Befehle für 8- und 16-Bit-Instruktionen hat, und 
ein "dec speicheradresse" nur mit 8-Bit-Datentypen funktioniert?

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Man muß bedenken, daß man mit Assembler die Vorteile von C (leicht 
portierbar, leicht änderbar, gut lesbar, gut wartbar) über Bord wirft, 
d.h. ob ein kleiner Code- oder Laufzeitvorteil das auch Wert ist.

von Klaus (Gast)


Lesenswert?

Peter D. schrieb:
> Die Compiler sind heutzutage aber oft so gut, daß es schwer fällt, in
> Assembler effizienteren Code zu schreiben.

Die PIC24 gibts mit bis zu 70MHz Befehlstakt und 512kB Flash. Damit ist 
der Prozessor als RISC mindestens 20 mal schneller als ein original 
IBM-AT (auf dem hab ich Schaltpläne gezeichnet und Spreadsheets 
gerechnet und die Software war bestimmt nicht in Assembler geschrieben). 
Da ist selbst das Suchen nach einem Assemblermanual verschwendete 
Lebenszeit.

Ich verwende die PIC24 gerne aber nur mit C. Ich weiß noch nicht mal, 
wieviel Register die CPU hat und brauch das auch nicht zum 
Programmieren.

MfG Klaus

von shitau (Gast)


Lesenswert?


von Klaus (Gast)


Lesenswert?

shitau schrieb:
> Das hängt von Deiner Applikation ab. Einige Gründe für Assembler findest
> Du hier:
>
> 
https://books.google.de/books?id=pjFsDAAAQBAJ&pg=PT64&lpg=PT64&dq=microchip+assembler+xc16&source=bl&ots=6CPw8mxAjw&sig=75Lpk6AfhK6idOK4kl8pVQDuZJk&hl=de&sa=X&ved=0ahUKEwiwk96Q-vHVAhXEI1AKHa1tC1k4ChDoAQg5MAM#v=onepage&q=microchip%20assembler%20xc16&f=false

Wirkliche Gründe kann ich da nicht finden, außer daß der Compiler bei 
ausgeschalteter Optimierung nicht optimiert.

Achso, daß man grundsätzlich (das für jede Archtektur optimierte) 
memmove() aus der libc benutzt und nicht Speicher zu Fuß durch die 
Gegend schiebt, wußte ich schon.

MfG Klaus

von Dieter W. (dds5)


Lesenswert?

Rufus Τ. F. schrieb:
> Könnte es sein, daß Dein handgeklöppelter Assemblercode
>
>> dec    _delay
>
> mit einer anderen Datengröße hantiert?
>
> Der C-Compiler-Output lässt erkennen, daß "delay" ein 16-Bit-Typ ist;
> welches "dec" rufst Du denn in Deinem Assemblercode auf?

Das ist schon in Ordnung.
Das "dec" ist synonym für dec.w, für eine 8-Bit Operation müsste man 
dec.b schreiben.

von shitau (Gast)


Lesenswert?

Klaus schrieb:
> Wirkliche Gründe kann ich da nicht finden

Hast Du den Buchauszug nicht gelesen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dieter W. schrieb:
> Das "dec" ist synonym für dec.w, für eine 8-Bit Operation müsste man
> dec.b schreiben.

Und der Prozessor kennt dec mit einer Adresse als Operand?

Wie sehen denn die Ausführungszeiten aus, könnte es sein, daß die 
getrennten Operationen

dec.w delay,w0
mov.w w0,delay

genausoviele Takte benötigen wie ein

dec.w delay

benötigen würde?

...

Ich hab' jetzt mal ins Manual der PIC24F gesehen, DEC als 
read-and-modify-Instruction benötigt zwei Zyklen, wenn das Ziel kein 
Prozessorregister oder "special function register" ist.

Sofern ich das richtig verstehe, brauchen also beide Varianten 
gleichviele Taktzyklen.

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.