Anfängerfrage
-
Moin. Ich lerne grade Assembler und bin auf ein Problem gestoßen:
Ich lese Zeichen von der Standardeingabe und pushe sie auf den Stack, so dass das Wort verkehrtrum drauf liegt. Jetzt will ich das Wort (natürlich richtigherum) ausgeben. Meine Idee dazu ist, esp um die Zahl eingelesener Zeichen zu erhöhen. Dann müsste er auf das erste Zeichen zeigen. Jetzt poppe ich das Zeichen und gebe es aus. Dadurch wurde esp wieder erhöht und ich muss ihn zweimal verringern, um an das nächste Zeichen zu kommen.
Meine Frage ist, ob dieser Ansatz prinzipiell funktioniert und ob es nicht auch einfacher geht
Danke schonmal!
Gruß
-
Ja, ich wuerde vorschlagen, du waehlst wenn moeglich einen ganz anderen Ansatz. Der Stack als eine Art im Speicher nach unten wachsende "FiLo-Queue" ist fuer solche Zwecke halt einfach ungeeignet.
zB. koenntest du deine Zeichen gleich in richtiger Reihenfolge in ein eigens reserviertes Array packen, statt sie zuerst falsch herum aufzustapeln, um sie anschliessend wieder umstaendlich umzudrehen.
-
Hallo!
Mein Problem ist, dass ich die Zahl der einzulesenden Zeichen nicht beschränken darf. Ich kann also nicht eine bestimmte Menge Speicher reservieren. Und was anderes, als mit dem Stack zu arbeiten fällt mir im Moment nicht dazu ein.
Gruß
-
Die Menge der Daten, die ein System verarbeiten kann, ist so wie so begrenzt - insbesondere ist der Stack auch begrenzt. Letztendlich existiert der ja auch nur in einem begrenzten, zuvor reservierten, jedoch theoretisch automatisch erweiterbaren array. Je nach System kommt es da frueher oder spaeter auch zu einem Ueberlauf.
Daher waere es IMHO geschickter, stattdessen gleich einen grossen Speicherbereich als Array zu reservieren und diesen bei bedarf auszulagern oder zu erweitern.... Jedenfalls solltest du dein Gesamtkonzept nochmal ueberdenken - unbeschraenkte Zeicheneingabe gibt es nicht.
-
Hm.. ich finds ja auch irgendwie blöd. Wenns nach mir ginge, würde ich einfach 1000 Zeichen einlesen und fertig. Leider hab ich die Vorgabe, keine feste Zahl an Zeichen einzulesen, damit ich auch aus Dateien lesen kann, deren Größe ich nicht kenne. Hm, dann bleibt mir wohl doch nur das Rumgespiele mit dem Stack

Gruß
-
"und diesen bei bedarf auszulagern oder zu erweitern. " Das hatte ich überlesen
. Kanns tdu mir erklären, wie man sowas macht?
-
Das kommt darauf an, was du mit dem Eingelesenen genau machen willst.
Auf so allgemeine Fragen kann ich auch nur allgemeine Antworten geben (oder theoretisch einen Roman schreiben, wofuer mir hier aber meine Zeit zu schade ist.
).Erlaeutere doch mal etwas dein Projekt.
-
Ich habe hier ein paar Aufgaben und soll Programme schreiben, die im Prinzip alle einen Input über die Standardeingabe bekommen, diesen irgendwie verarbeiten, und das Ergebnis zurückgeben. Bspw. ein Programm, das Buchstabenkombinationen wie 'ue' oder 'ae' durch 'ü' bzw. 'ä' ersetzt.Z.B:
Eingabe: Eine Uebung
Ausgabe: Eine Übung
-
Also kann man sich das so vorstellen, dass du stdin einzeln zeichenweise ausliest, bis zu einem speziellen Terminierungscode (return zB.), dann das Eingelesene verarbeitest und wieder irgendwie ausgeben sollst?
Ich denke mal, das soll in x86-Assembler realisiert werden? Auf was fuer einem System laeuft das Ganze dann ueberhaupt?Wie auch immer, da bei solchen Uebungsaufgaben die eingegebene Datenmenge sehr wahrscheinlich nie ueber ein paar Zeichen liegen wird, wuerde ich dafuer also vorschlagen, du holst dir erstmal vielleicht 4 oder 8kByte Speicher und liest den Kram von stdin dahin ein. Damit solltest du eigentlich erstmal auf der sicheren Seite sein. Tritt der unwahrscheinliche Fall ein, dass der Aufgabensteller sadistisch ist und etwas groesseres bearbeiten will, kannst du erstmal versuchen, mit einer entsprechenden resize-Funktion dem OS entsprechend mehr Speicher aus den Rippen zu leiern und weiter fuellen. Sollte der Speicher irgendwann tatsaechlich knapp werden, waere mein Vorschlag: Arbeite alles bisher eingelesene so weit wie moeglich durch (Vorsicht am Ende des Speichers wegen deiner Buchstabenkombinationen) und lass es ausgeben. Was am Ende im Puffer uebrig bleibt, verschiebst du an den Anfang des Puffers und befuellst einfach wieder neu.
Je nachdem, wie wichtig es ist, dass die Verarbeitung erst nach Ende der Eingabe erfolgt, waere es vielleicht vorteilhafter, gleich den zuerst reservierten kleinen Puffer abzuarbeiten und neu zu befuellen...
-
Ich hab leider nicht viel Ahnung von Assemblern, aber in C könnte man das mit einer Schlange probieren.
Prinzip First-In, First-Out
-
Geht natürlich in Assembler genau so, nur ist es da etwas mehr Schreibaufwand die Datenstruktur zu implementieren.