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
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?
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
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
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
Ggf. noch bedenken, daß bei *(p + n) die tatsächliche Schrittweite vom Typ von p abhängt. Sonst kommen die komischsten Sachen bei raus.
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.
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
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.
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
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.
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.
peter, mit einem "reinen c-compiler" meine ich eine ANSI-C sompiler und nach ANSI-C werden eben parameter auf den stack gelegt.
> 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. :-)
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... ;-))
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.