Forum: Mikrocontroller und Digitale Elektronik mit C in STACK schreiben


von ubootfanat (Gast)


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

von Ronny Schulz (Gast)


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?

von ubootfanat (Gast)


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

von Stephan Müller (Gast)


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

von Peter D. (peda)


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

von Matthias (Gast)


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.html#faq_reg_usage ganz
interessant sein.

Matthias

von hans (Gast)


Lesenswert?

Wirf mal einen Blick in stdarg.h, da solltest du Hinweise finden.

von Zotteljedi (Gast)


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.

von ubootfanat (Gast)


Lesenswert?

danke für die hilfe

hab den code jetzt in C getippt :-)

mfg florian

von tenner (Gast)


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.

von Matthias (Gast)


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

von Zotteljedi (Gast)


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.

von tenner (Gast)


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.

von Peter D. (peda)


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

von crazy horse (Gast)


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.

von Rufus T. Firefly (Gast)


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.

von tenner (Gast)


Lesenswert?

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

von Zotteljedi (Gast)


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

von Zotteljedi (Gast)


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

von Matthias (Gast)


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

von tenner (Gast)


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.

von Zotteljedi (Gast)


Lesenswert?

@tenner:

Melde Dich mal per E-Mail bei mir Auge zwinker

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.