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
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
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
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.
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.
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.
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
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.
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
Klaus schrieb: > Da ist selbst das Suchen nach einem Assemblermanual verschwendete > Lebenszeit. 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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.