ASM-Code und C in einem Programm

OP #6525738
Lesenswert?

Hallo,

dieses Semester machen wir einige Assembler und C-Projekte in der Uni 
und bis jetzt ist mir leider eine Sache nicht ganz klar geworden.

Konkret geht es um die Verwendung von ASM-Files (*.s) in C-Programmen.
Bei einem Projekt haben wir eine main.c als Rahmenprogramm 
(Funktionsköpfe und main{...}) vorgegeben bekommen und mussten die 
einzelnen Funktionen in Assembler in einem separatem Assembler-File 
implementieren.

Bei der Implementation habe ich immer angenommen, dass der erste 
Parameter einer Funktion in R0 und der zweite in R1 ankommt.
Ich weiß, dass die Register R0 bis R3 für Übergabeparameter vorgesehen 
sind (Procedure Call Standard for the Arm® Architecture, Seite 18/19), 
aber kann man immer annehmen, dass R0 der erste Parameter, R1 der 
zweite, usw. ist?
Gast #6525757
Lesenswert?

Felix M. schrieb:
> Übergabeparameter

Hi Felix,

Dem Prozessor ist das (grundsätzlich) erstmal wurscht.
Von C-Seite betrachtet, könnte der C-Compiler die Übergabelogik auf 
‚irgendeine‘ Weise machen.
Wenn Du Dich da per Assembler einklinken willst, musst Du das natürlich 
nach dieser Vorgabe machen und die Übergabe nach der Logik erwarten.
Es haben sich aber Techniken etabliert (hast Du ja auch schon einige 
genannt).
Kurzum: es hängt am Compiler/Assembler  wie da genau passiert.
Hier mal die Dokumentation z.B. des IAR Compilers (for ARM): 
http://ftp.iar.se/WWWfiles/arm/webic/doc/EWARM_DevelopmentGuide.ENU.pdf#page163

Gab es denn keine Aussage zur einzusetzen Tool-Chain (wie das 
neu-deutsch heisst)?

VG Stephan
OP #6525994
Lesenswert?

Vielen Dank für eure Antworten.

Ich sehe, dass ich mich wohl noch durch so einiges an Dokus durchwälzen 
darf :D

Dennis H. schrieb:
> Wenns zu viele Parameter werden gibts dann noch den Stack.

Stimmt, das hab ich fast schon wieder vergessen. Aber ganz so 
umfangreiche Argumente haben wir dann auch wieder nicht - da sah es bei 
den C++-Projekten schon ganz anders aus.
Gast #6526045
Lesenswert?

Felix M. schrieb:
> Aber ganz so umfangreiche Argumente haben wir dann auch wieder nicht -

Aber genau das kann der Compiler nicht wissen bzw. Berucksichtigen. Er 
muss heute Funktionen und Funktionsaufrufe umsetzen, die später mit ganz 
anderen Projekten zusammenarbeiten.

Von daher musst Du die genaue Festlegung nachlesen (in Doku oder 
notfalls im erzeugten Assembler erstelllter Dummy-Funktionen). Annahmen 
helfen da nicht.
#6526059
Lesenswert?

Felix M. schrieb:
> Bezogen war das eigentlich mehr auf das Ausweichen auf den Stack.
> Aber du hast natürlich Recht - die Register könnten genauso
> durch {something} aus dem restlichem C-Programm belegt sein und
> deswegen der Stack verwendet werden.

Die ABI, mit der ich mal zu tun hatte (Cortex-M3), definierte das 
ungefähr wie folgt (mal aus meinen alten Folien gekratzt und übersetzt):

Die ersten vier 32-Bit-Argumente liegen in R0, R1, R2 und R3 oder
die ersten beiden 64-Bit-Argumente liegen in R0:R1 und R2:R3 oder
das erste 128-Bit-Argument liegt in R0-R3.
Was bei Mischbestückung passiert, weiß ich aus dem Kopf nicht.

Weitere Argumente liegen auf dem Stack, von links nach rechts.

Der Rückgabewert liegt in R0 (32-Bit), R0:R1 (64-Bit) oder R0-R3 
(128-Bit).

Die Register R0-R3, R9, R12, LR und PC dürfen von einer Funktion 
zerstört werden, alle anderen Register müssen vor und nach dem 
Funktionsaufruf gleich sein.

Weitere Regeln existieren, hatte ich aber nicht in der Vorlesung. Der 
Kurs damals war ausschließlich Assembler, die ABI wurde also für jede 
Funktion und Aufgabe irgendwie definiert und musste von den Studenten 
entsprechend dokumentiert werden.
Gast #6526140
Lesenswert?

Felix M. schrieb:
> Ich sehe, dass ich mich wohl noch durch so einiges an Dokus durchwälzen
> darf :D

Eigentlich nicht. Abgesehen vom grundlegendem "Datenblatt" und von 
grundlegenden Programmiertechniken kommt es vor allem auf die 
Formalitäten bei der Parameterübergabe an. Das kann von Compiler zu 
Compiler, bzw. von Programmiersprache zu Programmiersprache etwas anders 
sein. Genau diese Formalitäten (des Entwicklungspacketes) sollte man 
aber gut kennen und im Debugger/Disassembling schnell wiederfinden.
OP #6526512
Lesenswert?

MaWin schrieb:
> Was funktioniert denn damit nicht?

Dein Vorschlag würde mit ziemlicher Sicherheit funktionieren (man könnte 
genauso gut auch alles rein in C schreiben), aber die Vorgabe der Profs 
ist, dass bestimmte Teile des Programms in Assembler zu schreiben sind.

Im aktuellem Projekt ist z.B. die main() und das komplette Interrupt 
Handling samt SysTick in Assembler zu schreiben.
Gast #6527276
Lesenswert?

Felix M. schrieb:
> aber die Vorgabe der Profs
> ist, dass bestimmte Teile des Programms in Assembler zu schreiben sind.

Was ist denn die Aufgabe genau?

a) Schreibe ein Assembler-Programm und rate, was der Compiler macht?
b) Schaue in der fiktiven Beschreibung ABC wie es der XY-Compiler mit 
Einstellung Z macht
c) bringe das zuverlässig zum Laufen

bei a... viel Glück, bei b lies halt nach und bei c kannst Du es auch 
den Compiler machen lassen und in Assembler weitermachen.
Gast #6527553
Lesenswert?

S. R. schrieb:
> Weitere Argumente liegen auf dem Stack, von links nach rechts

Das muss nicht so sein, für grössere Argumente kann man auch 
Speicherplatz reservieren und nur einen Pointer darauf übergeben. Das 
hat natürlich auch so seine Tücken, wenn man keine Erfahrung damit hat.

Meistens hat man sowieso die Wahl, ob man einer Prozedur die Daten 
selbst oder eine Kopie davon übergibt.

In vielen Fällen (beliebt z.B. beim Windows API) kann man viele 
Parameter in einem Record zusammenfassen und übergibt den Pointer darauf 
als einzigen Parameter.

Georg
Gast #6527583
Lesenswert?

Georg schrieb:
> Das muss nicht so sein, für grössere Argumente kann man auch
> Speicherplatz reservieren und nur einen Pointer darauf übergeben. Das
> hat natürlich auch so seine Tücken, wenn man keine Erfahrung damit hat.

Das hat aber mit dem ABI nichts zu tun sondern ist eine Ebene höher, dem 
API.
Gast #6527620
Lesenswert?

Felix M. schrieb:
> Im aktuellem Projekt ist z.B. die main() und das komplette Interrupt
> Handling samt SysTick in Assembler zu schreiben.

Da ist man schon mal im Vorteil, wenn man die Aussage kennt, dass es 
sich in C vor allem um Zeiger dreht.

Darüberhinaus geht es wohl u.a. auch darum, einen ordentlichen Interrupt 
selber zu schreiben, und entsprechend aufzurufen (lassen) zu können.
#6527794
Lesenswert?

S. R. schrieb:
> Solcherlei Aufgabenstellungen lauten nicht "schreibe funktionierenden
> Code", sondern sie lauten eher "löse folgendes Problem auf die in der
> Vorlesung / hier beschriebene Weise".

wenn das mal so wäre!
Leider sind auch Dozenten nicht fehlerfrei und lassen den Frust bei 
korrekter Umsetzung gemäß der Aufgabenstellung auch mal gerne an dem 
Prüfling aus!

Wie verstehst du denn folgende Aufgabenstellung:
"ermitteln sie den Wert des Integrals" programmierbare Rechner sind 
zugelassen!

Mit der keplerschen Fassregel und Programm habe ich die Aufgabe erfüllt 
und trotzdem 0 Punkte und eine Note 6 kassiert!
https://de.wikipedia.org/wiki/Simpsonregel

An keiner Stelle war Handarbeit gefordert und Käsekästchen unter der 
Funktion zu addieren kann der Rechner viel besser als ich.
#6527809
Lesenswert?

Joachim B. schrieb:
> Leider sind auch Dozenten nicht fehlerfrei [...]

Das ist mir klar. Aber wenn du mir unterstellen möchtest, ich sei ein 
furchtbarer Dozent gewesen, dann kann ich dir nur sagen, dass ich aus 
dem System raus bin. :-)

Arschlöcher gibt's überall im Leben und Arschlöcher mit Machtgefälle 
sind überall besonders unangenehm, egal ob das nun Dozenten, Lehrer, 
Chefs oder höherqualitative Kollegen sind.
#6527841
Lesenswert?

S. R. schrieb:
> Aber wenn du mir unterstellen möchtest

nie im Leben, ich kenne dich nicht!

Mit meinem Dozenten konnte ich mich später einigen und musste in der 
mündlichen Prüfung die 6 zu einer 2 umbauen.....
puh noch mal gut gegangen!
Aber ärgerlich fand ich das schon, leider waren nicht alle Dozenten 
fair, da konnte man nur demütig abnicken und hinnehmen.
#6528595
Lesenswert?

Joachim B. schrieb:
>> Aber wenn du mir unterstellen möchtest
> nie im Leben, ich kenne dich nicht!

Das freut mich. Es gibt hier nur so einige Spezialisten, die das 
vermutlich aus Prinzip anders sehen.

Was mich halt stört ist, wenn (absichtlich) Vorschläge gemacht werden, 
die die Aufgabenstellung untergraben. Und dann muss man sich als 
Korrektor - oft genug nichtmal für die Aufgaben verantwortlich! - mit 
Lösungen rumschlagen, die weder ins Lösungsschema passen noch 
ausgearbeitet sind. Das kostet Zeit und Nerven, wenn man den Studenten 
gegenüber einigermaßen fair sein möchte.

Es geht ja nicht nur um "die Lösung funktioniert theoretisch", sondern 
auch "die Standardlösung gibt 20 Punkte, die hier vorgestellte Lösung 
funktioniert komplett anders und funktioniert auf Anhieb nicht, könnte 
aber mit ein bisschen Debugging funktionieren, wieviele Punkte vergibt 
man dafür?".

Wer das nie gemacht hat, kann das vermutlich nichtmal einschätzen. Und 
ich kann Dozenten verstehen, die das komplett ausblenden und mit "hau 
ab" quittieren, obwohl ich das absolut nicht respektiere.
Gast #6530882
Lesenswert?

S. R. schrieb:
> Was mich halt stört ist, wenn (absichtlich) Vorschläge gemacht werden,
> die die Aufgabenstellung untergraben. Und dann muss man sich als
> Korrektor - oft genug nichtmal für die Aufgaben verantwortlich! - mit
> Lösungen rumschlagen, die weder ins Lösungsschema passen noch
> ausgearbeitet sind. Das kostet Zeit und Nerven, wenn man den Studenten
> gegenüber einigermaßen fair sein möchte.

Man darf auch nicht vergessen, bzw. übersehen, dass bestimmtes Know How 
bzw. bestimmtes Wissen oftmals schon ökonomisiert/optimiert angeboten 
wird.

Und als Student ist es heute oft so, da hat man kaum noch 
Freiheitsgrade, bei so vielem was zu Lernen ist. Hier haste Telefonbuch. 
Morgen wird abgefragt..
Einer der wenigen Wege hinaus aus dem Dilemma ist wirklich viel zu 
lernen - dabei helfen gut ökonomisierte Angebote, 
Überblicksartikel/professionelle Dokumentationen oder Hinweise wie bei 
Antwort 8. Die kann man ganz gut irgendwo hinpinnen. Vorzugsweise an 
einem der zehn Finger z.B.

Mit der AT&T Asm-Sytax (beim gcc) müsste man sich erstmal anfreunden. 
Ich meine, das geht leichter, wenn man schon die wichtigsten 
Assembler-Grundlagen intus hat.

Als ich an der Uni angefangen hatte, konnte man die Sprechzeiten bei den 
Professoren nutzen. Manchmal war ein Student vorher da, der brauchte die 
ganze Stunde.., ein anderes mal waren 2-5 Leute da, und man selbst kam 
auch schnell dran. Manchmal war gar keiner (vor mir) da.

Als ich (zur Jahrtausendwende) ging, standen 30-50 - und mehr Leute vor 
der Türe vom Professor. Da kann man Klausurbesprechung u.ä. vergessen - 
Belange wie Klausurbesprechung sollte man heutzutage möglichst vorher 
abhandlen. Normalerweise klappt das auch ganz gut, weil man Studenten 
fragen kann, die vor einem da waren.

Aber das ist auch wieder so eine Sache. Übertrieben abkürzen (mit 
Klausuroptimierten Skripts) sollte man nicht - sonst kann man das 
Studium (+ Motivation) an sich vergessen - aber weil die Inhalte großer 
Wissensmengen zu bearbeiten sind - gehen manche auf die Strategie, auf 
Lücke zu lernen oder man kickt halt einen Bereich - oder mehrere 
komplett raus und lernt nur auf bestehen.

Letztlich muss jeder für sich selbst einen Weg finden, wie mit den 
Unmengen an Wissen klarkommen.
#6531208
Lesenswert?

rbx schrieb:
> Mit der AT&T Asm-Sytax (beim gcc) müsste man sich erstmal anfreunden.
> Ich meine, das geht leichter, wenn man schon die wichtigsten
> Assembler-Grundlagen intus hat.

In erster Linie erwarte(te) ich, dass der Student in der Klausur den 
gleichen Assembler-Dialekt und Architektur verwendet, den er in den 
Vorlesungen vermittelt, in den Übungen verinnerlicht und im Praktikum 
angewendet hat.

> Als ich (zur Jahrtausendwende) ging, standen
> 30-50 - und mehr Leute vor der Türe vom Professor.

Dafür haben kluge Leute mal E-Mails erfunden.
Dummerweise ist nicht jeder Professor willens, das auch zu benutzen.
Dummerweise ist nicht jeder Student zur sinnvollen Nutzung fähig.

Klausurbesprechung kenne ich grundsätzlich aus der letzten Vorlesung. 
Bei manchen Dozenten sehr sinnvoll, bei manchen eher nutzlos.

> Letztlich muss jeder für sich selbst einen Weg finden, wie mit den
> Unmengen an Wissen klarkommen.

Bulimie-Lernen ist verbreitet und in den meisten Fächern (leider) die 
optimale Herangehensweise. Das Bildungssystem ist da nicht ganz 
unschuldig.

Andererseits muss man auch sagen, dass Frontalunterricht bei allen 
Nachteilen die mit Abstand die beste Methode ist, wenn man viel Wissen 
in kurzer Zeit vermitteln will. Und Studenten wollen Youtube-Videos, was 
ja effektiv auch nichts anderes ist, nur mit besseren Mitteln.
Gast #6531702
Lesenswert?

S. R. schrieb:
> Bulimie-Lernen ist verbreitet und in den meisten Fächern (leider) die
> optimale Herangehensweise. Das Bildungssystem ist da nicht ganz
> unschuldig.

Der spannende Teil ist: der Begriff (Bulimie) hört sich irgendwie schon 
so krank an..
Um so wichtiger ist auf jeden Fall, und das wird hier deutlich, dass 
vorsortiertes und voroptimiertes "Material" genutzt wird - sonst würde 
diese Geschichte gar nicht gut funktionieren, und die Gefahr von 
Motivationsverlust und Verzettelung wäre um so größer.

Für Assembler finde ich die Analogie mit Stützrädern bei einem einfachen 
Fahrrad gut. Man braucht die eine Zeit lang bzw. kann sie einfach 
nutzen, und bald kann man drauf verzichten und (Generalisiertechnisch) 
problemlos auf andere Fahrräder umsteigen. Für Motorradfahrerei ist 
dieser Schritt für Schritt-Aufbau sicher auch nicht so schlecht.

Aus einem ganz ähnlichen Grund hänge ich noch immer an dem 
Funktionsgenerator von Andreas (Ausgangsbasis/Stützrad für so einen 
Phase-Distortion-Synth).
Motivationstechnisch ist es bei mir aber eher so, das mich 
ARM-Hintergründe schon etwas stärker anfixen (als AVR).
( https://www.mikrocontroller.net/articles/Digitaler_Funktionsgenerator 
)
(Firma: Zombieland) #6531795
Lesenswert?

Felix M. schrieb:
> Konkret geht es um die Verwendung von ASM-Files (*.s) in C-Programmen.
> Bei einem Projekt haben wir eine main.c als Rahmenprogramm
> (Funktionsköpfe und main{...}) vorgegeben bekommen und mussten die
> einzelnen Funktionen in Assembler in einem separatem Assembler-File
> implementieren.
>
> Bei der Implementation habe ich immer angenommen, dass der erste
> Parameter einer Funktion in R0 und der zweite in R1 ankommt.
> Ich weiß, dass die Register R0 bis R3 für Übergabeparameter vorgesehen
> sind (Procedure Call Standard for the Arm® Architecture, Seite 18/19),
> aber kann man immer annehmen, dass R0 der erste Parameter, R1 der
> zweite, usw. ist?
wegen .s vermute ich mal, daß es sich um nasm Assembler handelt?
Welchen C Compiler verwendet Ihr denn? gcc oder was anderes?
Bißchen konkreter wäre nicht schlecht ... hier wirst Du allerdings 
sowieso keine Antwort finden; trotzdem viel Erfolg.
#6531894
Lesenswert?

rbx schrieb:
> Der spannende Teil ist: der Begriff (Bulimie)
> hört sich irgendwie schon so krank an..

Ist es ja auch...

rbx schrieb:
> Um so wichtiger ist auf jeden Fall, und das wird hier deutlich, dass
> vorsortiertes und voroptimiertes "Material" genutzt wird - sonst würde
> diese Geschichte gar nicht gut funktionieren, und die Gefahr von
> Motivationsverlust und Verzettelung wäre um so größer.

Breit gefächertes, wenig sortiertes und optimiertes Material wird von 
all jenen bevorzugt, die ein "holistisches" Bildungssystem wünschen. Was 
hier mit "seinen Namen tanzen lernen" verspottet wird, hat durchaus Hand 
und Fuß; vernetztes Wissen bleibt hängen, eine Faktensammlung nicht.

Davon abgesehen führt optimiertes Material immer zu einem Verlust von 
Wissen und dem wiederum trauern die Älteren nach, die dafür einstmals 
ihre Lebenszeit opfern mussten. Es gibt durchaus interessante 
Technologien, die mal verbreitet waren, es nicht mehr sind, aber unter 
den aktuellen Bedingungen durchaus wieder werden könnten. Haben die 
Entscheider aber nie von gehört, wird also auch nicht berücksichtigt.
Gast #6532109
Lesenswert?

S. R. schrieb:
> Bulimie-Lernen ist verbreitet und in den meisten Fächern (leider) die
> optimale Herangehensweise. Das Bildungssystem ist da nicht ganz
> unschuldig.

Manchmal ist es gut, wenn manche Dinge überhaupt einmal "drin" waren.

In Mechanik (bei uns ein Nebenfach) weiss ich noch, wie der Prof 
seinerzeit resümierte, dass ein Großteil der Studenten die 
Schrauben-Berechnung zum ersten Mal in ihrem Leben überhaupt in der 
Klausur selbstständig machen. In vielen anderen Fächern ist es ähnlich. 
Die Klausur nicht als Lernstandskontrolle sondern Akt des Lernens.

Ich weiss nur nicht, ob das jemals anders war: Bei Abkürzung im 
Bildungssystem (Mediziner-Test, IQ-Tests, Aufnahmeprüfungen) ist es oft 
genauso. Die einen, die die Materie als Hobby schon immer betrieben, 
schaffen "einfach so" Bestleistungen (ihnen fällt es also zu), die 
anderen üben den ganzen Abend vorher und fallen trotzdem durch. 
Klavierspielen schafft man doch auch, wenn man Abends vorher übt. Und 
daneben gibt es eine Vielzahl mittelmäßiger Kandidaten, die 2 Wochen 
vorher intensiv lernen, sich damit signifikant verbessern und das ganze 
erst die letzten Jahre als Bulimie-Lernen brandmarken.
#6532128
Lesenswert?

A. S. schrieb:
> In Mechanik (bei uns ein Nebenfach) weiss ich noch, wie der Prof
> seinerzeit resümierte, dass ein Großteil der Studenten die
> Schrauben-Berechnung zum ersten Mal in ihrem Leben überhaupt in der
> Klausur selbstständig machen.

Daran ist der Prof aber nicht ganz unschuldig.

Und mal Hand aufs Herz: Die wenigsten Studenten brauchen im ersten 
Studienjahr höhere Mathematik. Der Bedarf kommt erst lange nach den 
Klausuren.

Rückblickend waren die späteren und interessanteren Kurse auch immer 
mehr qualitativ als quantitativ. Da hat man dann auch keine DFTs mehr 
berechnet, sondern sich berechnen lassen und analysiert. Hauptsache man 
wusste, (a) dass man das berechnen kann, (b) grob was man tun müsste, 
wenn man wöllte und (c) was man daraus ablesen kann.

Unser Prof in E-Technik war immer traurig, dass die Studenten die 
Winkelfunktionen nicht mehr im Kopf zwischen bekannten Punkten 
interpolieren konnten. Mussten wir auch nicht können, wir hatten 
Taschenrechner...

A. S. schrieb:
> Klavierspielen schafft man doch auch, wenn man Abends vorher übt.

Ja, aber nicht, wenn man nur am Abend vor der Klausur intensiv übt und 
sich dann auf sein Kurzzeitgedächtnis verlässt. ;-)
#6533678
Lesenswert?

Felix M. schrieb:
> aber kann man immer annehmen, dass R0 der erste Parameter, R1 der
> zweite, usw. ist?

Der erfahrene Programmierer nimmt gar nichts an.
Er schreibt eine Dummyfunktion, die genau die benötigte Anzahl und Typen 
der Argumente, Returnwerte und Variablen verwendet. Diese läßt er dann 
nach Assembler compilieren und hat somit den Rumpf für sein 
Assemblerprogramm.
Wichtig ist dabei, auch die gewünschten Compilerschalter und 
Optimierungslevel zu setzen. Je nach Compiler und Target kann das 
nämlich auch die Argumentenübergabe beeinflussen.
Z.B. beim Keil C51 unterscheidet sich der erzeugte Rumpf für Small und 
Large erheblich.
Beitrag #6533701 wurde von einem Moderator gelöscht.
#6533871
Lesenswert?

Peter D. schrieb:
> Der erfahrene Programmierer nimmt gar nichts an.

Würde ich so nicht unterschreiben. Der erfahrene Programmierer schaut 
sich an, was garantiert wird (d.h. schaut in die Dokumentation vom ABI), 
prüft das und hält sich dann an die Regeln.

Peter D. schrieb:
> Z.B. beim Keil C51 unterscheidet sich der
> erzeugte Rumpf für Small und Large erheblich.

Ja, das sind unterschiedliche ABIs, die von Keil ganz sicher auch 
passend dokumentiert sind.
#6534313
Lesenswert?

S. R. schrieb:
> Der erfahrene Programmierer schaut
> sich an, was garantiert wird (d.h. schaut in die Dokumentation vom ABI),
> prüft das und hält sich dann an die Regeln.

Nun, das ist prima, wenn man mehrere Baustellen gleichzeitig aufreißen 
will.
Funktioniert etwas nicht, dann kann es sein, daß die ABI-Doku fehlerhaft 
ist oder man hat sie nicht richtig verstanden/verwendet oder das 
Programm ist fehlerhaft.
Läßt man aber den Compiler das machen, was er am besten kann, also einen 
Rahmen erstellen, fallen schonmal 2 Baustellen weg. Außerdem geht das 
deutlich schneller.

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