mit C in STACK schreiben

Gast
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?
Gast
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
Gast
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..
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
Gast
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.
Gast
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
Gast
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.
Gast
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.
@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
Gast
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.
Gast
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.
Gast
> 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. :-)
Gast
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... ;-))
Gast
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.