Hallo Leute Ich habe früher immer alles in C programmiert für meine AVR Prozessoren. Ich habe viel von den enormen Vorteilen von ASM gehört und habe dann beschlossen, mich damit zu befassen. Ich bin egeister von der Performance meiner ersten ASM Programme! Nun habe ich aber einige Fragen: 1. In C kann man so wunderschöne Libs machen und dann jeweils einfach die Header und die Source in das aktuelle Projekt einbinden. Kann man so was auch mit ASM machen? 2. Ich würde gerne C und ASM mischen. Kann man Funktionen in ASM programmieren und sie dann in einem C Projekt einbinden als Header oder so? Würde mich auf schnelle Antworten freuen. Wenn jemand ein Tutorial kennt (Deutsch oder Englisch), wäre ich auch nicht abgeneigt. Mit freundlichen Grüssen Immanuel
1: Nur wenn die ASM-Umgebung mit Linker arbeitet. Also GNU-Assembler ja, AVR-Assembler nein, bzw. nur indem die Lib mitassembliert wird. 2: Ja. Je nach Compiler kann man den ASM-Code auch direkt in den C-Code reinschreiben.
Normalerweise ist es andersrum. Man fängt mit ASM an und hört dann wie toll C ist und steigt dann um. Deswegen würde ich bei C bleiben und nur teilweise in ASM arbeiten. Ich shreibe lieber in C: if (16bitzahl + 10 >= 16bitzahl) als mir zu überlegen wie war das jetzt mit dem vorzeichen und welcher asm Befehl usw. Der REst ist eh gleich und deswegen oper ich leiber 20%Flash speicher als das ich die übersicht verliere!!!
>enormen Vorteilen von ASM Welche? >Ich bin egeister von der Performance meiner ersten ASM Programme Das lässt ja auf die Qualität deiner C-Programme schliessen... >2. Ich würde gerne C und ASM mischen. Kann man Funktionen in ASM >programmieren und sie dann in einem C Projekt einbinden als Header oder >so? Inline-Assembler? >Der REst ist eh gleich und deswegen oper ich leiber 20%Flash speicher Muß nicht mal sein...
Immanuel Nekvasil wrote: > Ich bin egeister von der > Performance meiner ersten ASM Programme! Dann hast Du in C nicht effizient programmiert (alles float oder int, wo dicke ein char reicht, usw.). > 1. In C kann man so wunderschöne Libs machen und dann jeweils einfach > die Header und die Source in das aktuelle Projekt einbinden. Kann man so > was auch mit ASM machen? Du kannst auch in Assembler Files includieren und auch mehrere Objekte linken. > 2. Ich würde gerne C und ASM mischen. Kann man Funktionen in ASM > programmieren und sie dann in einem C Projekt einbinden als Header oder > so? Las es sein. Du müßtest sämtliche Assemblerobjekte nochmal neu schreiben, daß sie sich an die C Konventionen halten. Peter
Ich schau oft in den von C compilierten Assemblercode rein und schaue wie das compiliert wurde. Damit habe ich schon gelernt wann welche C-Befehle sinnvoller sind. Nur mal als Beispiel: nicht in C von 1 bis 20 zählen sondern von 19 bis 0.
Ich musste auch feststellen, dass wenn mans einigermassen klug in C schreibt, macht der Compiler schon das bessere draus als ich in ASM. Aber grösser scheinen die C-Programme schon zu werden. Man muss aber auch sagen, das mein grösstes ASM-Projet etwa 3-4Kb waren, in den Atmega8 passen aber 8. Und die übersichtlichkeit wächst definitiv nicht linear mit der Programmgrösse, da lasse ich dann doch den Compile wirken auch wenns minim grösser wird. Ich fands schon ab 1kB nicht mehr richtig übersichtlich in ASM, gut liegt auch an meinem Programmierstil, aber C machts da einem einfacher...
Erstmal grossen Dank für eure Antworten. Leider bekam ich aber nicht wirklich brauchbare Antworten auf meine Fragen. Ueberlasst bitte mir die Entscheidung, ob ich in ASM programmiren will oder nicht (ich will ja sicher nicht alles in ASM machen), die Frage war ja auch nicht ASM vs C. Ich hätte einfach gerne Antworten auf meine Fragen. @Peter: Also erstens will ich nicht alte Projekte umbasteln, sondern das ist für neue Projekte. Und auch da möchte ich bitten, mir diese Entscheidung zu überlassen. Es wäre sehr viel hilfreicher, wenn Du mir sagen könntest, wie ich das machen muss. Wenn ich jetzt also ein ASM file habe, dass ich includieren möchte, muss ich dann eine Header machen für das ASM-File und so etwas ähnliches wie in C machen mit den Präprozessoranweisungen (#ifndef, #define, #endif)?
Ach, sorry, ich habe noch etwas vergessen. Kann mir jemand den Unterschies zwischen GNU ASM und AVR ASM erklären? Also ich nehme jetzt mal an, dass das AVR ASM nur für AVR Controller benutzbar ist, da ja jede andere Familie andere Befehle nützt. Was ist jetzt dann aber genau GNU ASM? Der begriff ist mir jetzt schon mehrmals über den Weg gelaufen und ich weiss immer noch nicht genau, was das jetzt ist. Wäre sehr freundlich von euch. Immauel
C vs. ASM - die Frage ist für mich längst zugunsten von ASM entschieden. Weils einfach Spaß macht, den Controller bis auf's letzte auszureizen, mit unübertroffen schnellem und ultrakompaktem Code. Immanuel, laß Dich nicht beirren von den vielen C-Ideologen hier, die aus Denkfaulheit lieber dicke schwerfällige C-Brocken in die netten kleinen AVRs pressen !
... und die Stilmittel sind in AVR-ASM auch enthalten, übersichtlichen Code zu gestalten. Wenn man sich erst mal die Mühe gemacht hat, gewisse Grundstrukturen und Funktionen für den täglichen Einsatz zu coden, dann muß ein ASM-Projekt auch nicht ausarten. Doch wie Tim schon sagt, ein wenig Einsatz ist schon erforderlich. Von nix kommt eben nix. Gruß Gerald
Immanuel Nekvasil wrote: > @Peter: > Also erstens will ich nicht alte Projekte umbasteln, sondern das ist für > neue Projekte. Dann ist es umso unverständlicher. Du kriegst daraus nur die Summe der Nachteile von Assembler und von C. > Es wäre sehr viel hilfreicher, wenn Du mir sagen könntest, > wie ich das machen muss. Das geht nicht, da ich nicht hellsehen kann. Solche Sachen sind total compilerabhängig und woher soll ich wissen, welchen Compiler Du nimmst ? > Wenn ich jetzt also ein ASM file habe, dass ich includieren möchte, muss > ich dann eine Header machen für das ASM-File und so etwas ähnliches wie > in C machen mit den Präprozessoranweisungen (#ifndef, #define, #endif)? Klingt so, als hättest Du noch nie Multi-Objekt Programme geschrieben. Mach das erstmal und dann kannst Du Dich an Assembler wagen Assembler kann man nicht in C includieren und umgekehrt. Du mußt also aus dem Assemblerfile ein eigenes Objekt machen und dann dazu linken. Wie das geht, erfährst Du aus dem Manual des Compilers Deines Vertrauens. Peter P.S.: Es gibt noch Inline-Assembler und das "Nackt"-Attribut, aber auch da sage ich nur: Finger weg !
@Tim T && Gerald Ich bin fest entschlossen ASM-Guru zu werden ;) Davon werden mich die Leute hier nicht abhalten. Wie ich schon sagte sollten sie diese Entscheidung ja auch mir überlassen. Ich habe bis jetzt in ASM auch noch keine grossen Nachteile gefunden. @Peter Also ich nutze das AVR-Studio und den darin enthaltenen Compiler. Was ist ein Multi-Objekt Programm? Woran erkennt man ein solches? Wenn ich jetzt aus einem ASM-Fiel ein Objekt mache, kann ich dann diese mit eine C-Projekt verlinken und benutzen? Dein P.S. interessiert mich sehr. Was ist Inline-ASM und was ist das "Nackt"-Attribut? Und bitte nicht Finger weg! Ich will ALLES wissen und am besten auch anwenden können, auch wenn andere Leute von diesen Sachen nicht so begeistert sind. P.S: Kann mir bitte noch jemand erklären was jetzt genau GNU-ASM ist?
Immanuel Nekvasil wrote: > Ich bin fest entschlossen ASM-Guru zu werden ;) Hat niemand was dagegen. Aber meine Devise ist: entweder oder, nicht UND. Ich habs einmal gemacht und mit dermaßen die Finger dabei verbrannt (Zeitaufwand stand in keinerlei Verhältnis zum Nutzen), nie wieder. > Was ist ein Multi-Objekt Programm? Woran erkennt man ein solches? Du hast mindestens 2 Source-Files, die sich NICHT includieren sondern in getrennte Objekte (*.obj) compiliert/assembliert werden. Und damit das klappt, mußt Du zu jedem Source Headerfiles (*.h) anlegen, die die Prototypen den anderen Sourcen bekannt geben, sonst gibts Compiler-Fehler. > Wenn ich jetzt aus einem ASM-Fiel ein Objekt mache, kann ich dann diese > mit eine C-Projekt verlinken und benutzen? Ja, wenn sie relocatable sind und sich mit den Aufrufkonventionen, Variablendeklarationen, Stackmanagement Deines Compilers vertragen. > Dein P.S. interessiert mich sehr. Was ist Inline-ASM und was ist das > "Nackt"-Attribut? Such mal auf Deiner HD "avr-libc-user-manual-1.4.3.pdf" und dann lies einfach mal darin. Besser kann ichs auch nicht erklären. > P.S: Kann mir bitte noch jemand erklären was jetzt genau GNU-ASM ist? GNU und AVR haben miteinander etwa soviel am Hut wie Mecklenburg und Cox. Das eine ist ein Softwarelizenzmodell (Anbaugebiet), das andere ein Target-Typ (Apfelsorte). Eine andere hier oft gemachte totale Begriffsverwurstung ist Atmel mit AVR gleichzusetzen.
Also ich habe demfall in C schon einige Programme geschrieben, die Multi-Objekt sind. War mir aber bisher einfach nicht klar, dass man das so nennt. Also wenn ich das selbe in ASM machen will, wie muss ich das machen? (also auch so, dass ich sie in ein C-Projekt einbinden kann. In der Hilfe finde ich das irgendwie einfach nicht.
Hallo zusammen, habe gerade den Thread überflogen und bin über Sachen gestolpert wie: >Assembler kann man nicht in C includieren und umgekehrt Mit inline-Assembler kann man sehr gut arbeiten, und dank der flexiblen Syntax z.B. mit "abstrakten Registern" arbeiten (ich meine die Wertübergabe etc.) - so geht es Hand-in-Hand mit dem Compiler. Die ganze Diskussion C vs. ASM fängt langsam an zu nerven... Ein Bruchteil des gesamten Quelltextes ist für die Gesamtperformance des Programmes verantwortlich - diese Tatsache allein ist das beste Argument für einen ASM-verschönten C-Quelltext :-) @Immanuel Nekvasil: Guck doch mal hier: http://www.nongnu.org/avr-libc/user-manual/inline_asm.html Das fand ich äußerst hilfreich.
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.