Assembler Programm mit C routine?

Gast #850125
Lesenswert?

Im Prinzip ja, aber ...

Es wäre einfacher, von einem C-Programm Assembler-Routinen aufzurufen.

Wenn Du es dennoch probieren willst, lasse Dir aus Deinen C-Routinen 
nicht den Code sondern einen Assembler Quellcode erzeugen, den Du dann 
einbinden und mit übersetzen lassen kannst.
Du mußt aber beachten, daß Stack und andere Speicherbereiche von Deiner 
Assemblerquelle zur Verfügung gestellt und initialisiert werden müssen.
Gast #850146
Lesenswert?

Am einfachsten wird es sein, wenn Du ein C-Programm schreibst, das 
sofort Deinen Assembler-Code aufruft. Dann sind alle Initialisierungen 
für Deine C-Routine erledigt und kannst sie später bedenkenlos aufrufen.

Aber mal eine Frage: Welchen Compiler willst Du denn nutzen? Ich frage, 
weil Du C++ und nicht C nutzen willst. Ich kenne keinen vernünftigen 
C++-Compiler für 8051...
Gast #850348
Lesenswert?

Habe die C-Routine noch nicht geschrieben, aber ich möchte eigentlich 
nur eine Zahl (200) durch einen gemessenen Wert (0.1 - 200) dividieren 
und dann das Resultat mit 3.6 multiplizeren.

Habe keine Ahnung ob das mit einer C-Routine funktionieren könnte..

Gruss
#850367
Lesenswert?

Wie du schon mitgekriegt haben wirst, ist das Einbinden einer
C-Funktion in ein Assembler Programm nicht so das wahre
(wenn ich mal die Methode "den Compiler ein Assemblerlisting
generieren lassen und dann abtippen" ausser acht lasse).

Anders rum ist das meist einfacher: Ein C Programm schreiben,
das in manchen Stellen auf Assembler Funktionen zurückgreift.

Allerdings erhebt sich bei mir bei deiner Aufgabenstellung
die Frage: Wozu brauchst du da überhaupt Assembler?
Gast #850378
Lesenswert?

Mein Ausbildner wollte dass ich das ganze in Assembler schreibe, weil 
ich bei meiner Teilprüfung in 2 Monaten auch Assembler programmieren 
muss.
Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen 
und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach 
nicht genau hin, deshalb habe ich mir jetzt überlegt ob man das mit 
einer C-Funktion machen kann.

Gruss
Gast #850388
Lesenswert?

Wenn du y= 200 / x * 3.6 rechnen willst, mit x = 0.1 ... 200
würde ich folgendes Vorschlagen:

y = 7200 / x    mit x= 1..2000
Damit umgehst du numerische PRobleme, sowie Kommazahlen.
Bei Anzeigen machst du einfach einen Punkt vor die letzte Stelle.
ZUr Rechnung kannst ja mal in den Anhang dieses Links gucken:

Beitrag "Re: Schnelle(re)s Quadrieren??"

Da nimmst du die Div Routine, rüfst die mit 7200 und x auf und fertig.
#850395
Lesenswert?

Florian wrote:
> Mein Ausbildner wollte dass ich das ganze in Assembler schreibe, weil
> ich bei meiner Teilprüfung in 2 Monaten auch Assembler programmieren
> muss.
> Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen
> und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach
> nicht genau hin, deshalb habe ich mir jetzt überlegt ob man das mit
> einer C-Funktion machen kann.

Na ja. Das ist aber dann geschummelt.
Denn dein Ausbildner möchte dann ja haben, dass du ihm zeigst
dass du 16 Bit Arithmetik machen kannst.

> aber ich möchte eigentlich
> nur eine Zahl (200) durch einen gemessenen Wert (0.1 - 200)
> dividieren und dann das Resultat mit 3.6 multiplizeren.

Du willst also berechnen

   200 / x * 3.6

das stellst du gleich mal etwas um

   200 * 3.6 / x

die 200 * 3.6 kannst du gleich ausrechnen: das macht 720

Du musst also rechnen: 720 / x

Jetzt denke ich aus deiner Aufgabenstellung herausgelesen
zu haben, dass du die Zeit auf 1/10 Sekunden genau misst.
Und diese Kommastelle macht Probleme. Die Lösung: Verschiebe
das Komma um 1 Stelle. Das x hat dann die Einheit 1/10 Sekunde
Ein x Wert von 125 bedeutet also 12.5 Sekunden. Damit
wird deine Berechnung zu

    7200 / x

Und du kommst mit einer stinknormalen 16 Bit Division gut über
die Runden.
Gast #850620
Lesenswert?

@ Karl Heinz

>(wenn ich mal die Methode "den Compiler ein Assemblerlisting
>generieren lassen und dann abtippen" ausser acht lasse).

Man muß nichts abtippen!
Als mißtrauischer Zeitgenosse sehe ich mir hin und wider an, was der 
Compiler aus meinen Geschreibe generiert. Wenn etwas nicht optimal zu 
sein scheint, kann man nachträglich optimieren. Hast Du so etwas nie 
gemacht?

Aber gut, die aktuelle Codeerzeugung macht "Nachoptimierungen" 
heutzutage entbehrlich.
Gast #984442
Lesenswert?

Ich hab genau das oben genannte Problem. Ich will aus einem C- Programm 
eine Assemblerroutine aufrufen. Diese besitzt keinerlei 
übergabeparameter.Mein problem ist jetzt unter welchem Name ist die 
Routie aufrufe bzw wie ich sie in eine Header einfüge.

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