mit C in STACK schreiben

Gast #121411
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
Gast #121412
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..
#121413
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
Gast #121418
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.
Gast #121419
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
Gast #121421
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.
#121422
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
Gast #121423
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.
Gast #121424
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.
Gast #121426
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. :-)
Gast #121428
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
Gast #121429
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.

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