mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mit C in STACK schreiben


Autor: ubootfanat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir jemand sagen, wie ich einen direkten Wert zb 0x45 mittels
C-Programmierung in einen ATmega16-Stack schreiben kann?

danke schon im voraus

mfg florian

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht das für einen Sinn?

Der Stack wird in C selbst verwaltet. Würde man da drin rumschreiben,
würde das ganze Programm durcheinanderkommen. Warum also?

Autor: ubootfanat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es geht darum, Werte an ein ASM-Prog zu übergeben!

da nicht immer gleich viele argumente übergeben werden sehe ich als
einzigen Ausweg den Stack!

den stack in asm auszulesen ist überhaupt kein problem! C macht dabei
anständig probleme!

bitte helft mir!

danke schon amal im voraus

mfg florian

Autor: Stephan Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du die anfangadresse vom stack kennst und weisst wann
er erhöht wird, kannst du ja per

x = *(start+offset); von dort lesen
*(start+offset) = 0x45; und schreiben

kenn mich beim atmega nich aus.. weiss nur wie es beim intel x86 ist.

mit asm kannst ja den eip register manipulieren.
oder mit ebp im stack rumschreiben

mov dword [ebp-16], 0x45  z.b.

wie gesagt, keine ahnung vom atmega µC..

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Machs doch einfach so:

Das C-Programm legt ein Feld an und schreibt dort alles rein.
Und der Assemblerfunktion wird einfach der Zeiger auf dieses Feld
übergeben, entweder in einem Registerpaar oder in einer globalen
Variablen.
Die Länge des Feldes kann man z.B. in das erste Element schreiben.


Peter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

schau dir an wie der Compiler Funktionsparameter übergibt. Dann kannst
du mit einem Funktionspointer deine ASM-Routinen aufrufen.

Beim GCC dürfte
http://www.nongnu.org/avr-libc/user-manual/FAQ.htm... ganz
interessant sein.

Matthias

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wirf mal einen Blick in stdarg.h, da solltest du Hinweise finden.

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ggf. noch bedenken, daß bei *(p + n) die tatsächliche Schrittweite vom
Typ von p abhängt. Sonst kommen die komischsten Sachen bei raus.

Autor: ubootfanat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die hilfe

hab den code jetzt in C getippt :-)

mfg florian

Autor: tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin, auch wenn du's jetzt schon in c gelöst hast.
wenn du von c aus eine funktion aufrufst, werden die übergabe-parameter
und die rücksprungadresse auf dem stack abgelegt. wenn du weißt wieviele
parameter übergeben werden und die größe kennst, ist es simpel. wenn die
anzahl der parameter variabel ist, übergibst du beim funktionsaufruf
einen weiteren weiteren parameter mit der anzahl.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

wer sagt denn das C die Parameter über den Stack übergibt? Der AVRGCC
übergibt z.B. soviel Parameter wie möglich in Registern. Damit können
bis zu 9 Parameter in Registern übergeben werden. Sollte für die
meisten Fälle ausreichen.

Die Übergabe von Parametern an Funktionen ist von Compiler zu Compiler
(und noch viel mehr von Maschine zu Maschine) unterschiedlich. Es gilt
deshalb immer: RTM

Matthias

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ACK, aber in diesem Fall würde ich jeden noch so dreckigen
Assembler-Output des gcc seiner Doku vorziehen, die ist nämlich noch
viel weniger leicht durchschaubar.

Autor: tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, du hast natürlich recht, der gcc zb. übergibt seine parameter bei
fester parameterlistenlänge in den registern, erst wenn die anzahl der
dafür zur verfügung stehenden register erschöpft ist werden die weitern
parameter auf den stack gelegt.
ein reiner c-compiler "sollte" allerdings die parameter auf den stack
legen, zumindest solange keine optimoerung eingeschaltet ist. naj, bei
mircrocontrollern ist halt alles anders.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tenner

"ein reiner c-compiler "sollte" allerdings die parameter auf den
stack
legen"


Was ist ein "reiner c-compiler" ?

Warum "sollte" er Parameter auf den stack legen ?

Ein C-Compiler soll aus ANSI-C einen ausführbaren Code generieren, der
genau das tut, was in C geschrieben wurde.
Wie er das macht, ist egal. Natürlich sollte er es möglichst effizient
machen und das geht ja nur durch soviel wie möglich Registernutzung
anstelle lahmer Memory-Operationen.
Auf dem PC ist das ja auch so, ist also keine MC-Spezialität.


Peter

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier wird immer von "dem Stack" gesprochen - welcher Compiler benutzt
denn nur den Hardwarestack? Wäre zwar denkbar, aber komplizierter und
langsamer.
-Daten pushen
-UP aufrufen
um im UP jetzt an die Daten zu kommen, muss erstmal die
Rücksprungadresse gelesen und gemerkt werden (die jetzt noch gar nicht
gebraucht wird), anschliessend die Daten gelesen, am Ende die
Rücksprungadresse wieder in stack stopfen, dann erst ret.
Also gibts einen gesonderten Datenstack.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö. Normale C-Compiler verwenden genau den einen Stack, den der
Prozessor hat - und auf dem landen sowohl Rücksprungadresse als auch
Daten. Auf den Stack kann man auf vernünftigen Prozessoren auch über
[SP+Offset] zugreifen, so daß man sich gar nichts merken muss, da kein
pop oder ähnliches stattfindet. Welche Offsets zu verwenden sind, weiß
der Compiler - sieh' Dir mal ein Assemblerlisting an, das ein übliche
C-Compiler erzeugt hat.

Autor: tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
peter, mit einem "reinen c-compiler" meine ich eine ANSI-C sompiler
und nach ANSI-C werden eben parameter auf den stack gelegt.

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> und nach ANSI-C werden eben parameter auf den stack gelegt.

Zeigen! Zeigen!! Mein Einsatz ist 10 Euro. ISO8898:90, wir sind uns da
einig? Ich habe zwar nur den 99er da, aber da taucht das Wort Stack
kein einziges mal auf. Es hat auch in de.comp.lang.c bereits blutige
Schlachten gegeben, aber ich bin natürlich gerne bereit mich belehren
zu lassen. :-)

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich meine natürlich ISO9899, da meint man, wenn nur zwei Sorten
von Ziffern drin sind, und eine 3mal und eine 1mal drin vorkommt, kann
man's nicht mehr verdrehen... ;-))

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

warum sollte der S-Standard auch soetwas vorschreiben? Der Standard
kennt ja die Maschine garnicht. Und ob die Maschine einen Stack hat ist
nicht wirklich garantiert. Ich würde mal tippen das das "implementation
defined" ist. Es also jeder so machen kann wie er will hauptsache es
funktioniert.

Matthias

Autor: tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich will hier keines falls ne blutige schlacht vom zaun brechen, meine
alten volesungsscripte sagen aber genau das aus. die iso hab ich leider
nicht hier, kann das da also auch nicht nachschauen.

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@tenner:

Melde Dich mal per E-Mail bei mir Auge zwinker

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.