Assemblercode im Microchip-XC16-Compiler

Gast #5121278
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.
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
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
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.
Gast
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.
Persönliche Seite
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
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
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.