Assemblercode im Microchip-XC16-Compiler

Gast #5121278
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.
#5121962
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.
Gast #5121979
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
Gast #5121993
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.
Persönliche Seite #5122025
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?
Gast #5122089
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
Gast #5122120
Lesenswert?

Gast #5122142
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
#5122149
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.
Persönliche Seite #5122219
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.

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