Forum: Mikrocontroller und Digitale Elektronik ASM => einige Fragen


von Immanuel N. (sputnik)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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!!!

von Rahul, der Trollige (Gast)


Lesenswert?

>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...

von Herm (Gast)


Lesenswert?

Zu 1) man kann includefiles verwenden

H.

von Peter D. (peda)


Lesenswert?

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

von Armin K. (-donald-) Benutzerseite


Lesenswert?

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.

von Heinz K. (heinzkleister)


Lesenswert?

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...

von Immanuel N. (sputnik)


Lesenswert?

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)?

von Immanuel N. (sputnik)


Lesenswert?

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

von Tim T (Gast)


Lesenswert?

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 
!

von Gerald (Gast)


Lesenswert?

... 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

von Peter D. (peda)


Lesenswert?

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 !

von Immanuel N. (sputnik)


Lesenswert?

@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?

von Peter D. (peda)


Lesenswert?

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.

von Immanuel N. (sputnik)


Lesenswert?

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.

von antworter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.