String zusammenfügen

studentabc
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 31. Okt 2011 13:56

String zusammenfügen

Beitrag von studentabc »

Wir haben ein generelles Problem mit Strings. Diese wurden uns (bisher) nicht in der Vorlesung näher erklärt.
Gibt es eine Möglichkeit zwei Strings zusammenfügen?

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: String zusammenfügen

Beitrag von mw1039 »

Du kannst z.B. am Anfang eine konstante Menge Speicher reservieren (am besten konservativ schaetzen, z.B. 100 Byte) und dann die einzelnen Zeichen/Bytes immer da rein kopieren.

downsampling
Mausschubser
Mausschubser
Beiträge: 95
Registriert: 28. Mär 2011 22:58

Re: String zusammenfügen

Beitrag von downsampling »

Und wie macht man es in Asm?

core
Mausschubser
Mausschubser
Beiträge: 55
Registriert: 3. Sep 2011 16:29

Re: String zusammenfügen

Beitrag von core »

mw1039 hat geschrieben:Du kannst z.B. am Anfang eine konstante Menge Speicher reservieren (am besten konservativ schaetzen, z.B. 100 Byte) und dann die einzelnen Zeichen/Bytes immer da rein kopieren.
Dafür gibt es doch sicherlich auch ein hilfreiches Code-Beispiel?

Benutzeravatar
zimpfer
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 144
Registriert: 15. Mär 2009 01:07

Re: String zusammenfügen

Beitrag von zimpfer »

core hat geschrieben:
mw1039 hat geschrieben:Du kannst z.B. am Anfang eine konstante Menge Speicher reservieren (am besten konservativ schaetzen, z.B. 100 Byte) und dann die einzelnen Zeichen/Bytes immer da rein kopieren.
Dafür gibt es doch sicherlich auch ein hilfreiches Code-Beispiel?

Ja, in toDecimal_frame.asm:

.comm roman, 100, 1

Dieser Befehl bedeutet, dass 100*1 Byte reserviert wird im Speicher

Drno
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 236
Registriert: 10. Feb 2005 20:16

Re: String zusammenfügen

Beitrag von Drno »

Strings? Was sind Strings? ;-)
Programming today is a race between software engineers striving to build bigger and better idiot proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.

tacu
Mausschubser
Mausschubser
Beiträge: 64
Registriert: 13. Apr 2011 18:35

Re: String zusammenfügen

Beitrag von tacu »

mir machen die strings total zu schaffen :(

wie kann ich denn jetzt einen string erweitern, also hinten etwas dran hängen? ich finde überhaupt keine brauchbaren erklärungen für das ganze :( gibt es da nicht einen beispielcode für?

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: String zusammenfügen

Beitrag von mw1039 »

Wenn du Strings im globalen Speicher liegen hast, dann kannst du sie nicht einfach so erweitern. Deswegen kannst du z.B. einfach am Anfang grosszuegig viel zu viel Speicher reservieren (z.B. 100 Byte). Wenn du etwas anfuegen moechtest, musst du einfach nach dem Ende des bisherigen Strings suchen (z.B. nach der 0 am Ende suchen oder die bisherige Laenge in einer separaten Variable merken), den Rest hinten ran kopieren und wieder eine 0 anhaengen. Das rankopieren kannst du z.B. einfach mit movb machen.
Drno hat geschrieben:Strings? Was sind Strings? ;-)
Das ist insofern ein sehr guter Hinweis, als dass es schlichtweg keine Strings in Assembler gibt. Es sind nur einfache Bytefolgen. Man muss sich gedanklich davon verabschieden all die vielen nuetzlichen Funktionen aus Hochsprachen zu haben.

elgubbo
Erstie
Erstie
Beiträge: 21
Registriert: 28. Okt 2011 19:40

Re: String zusammenfügen

Beitrag von elgubbo »

leider habe ich auch riesen probleme mit der bearbeitung eines bestimmten speicherbereiches (nichts anderes sind unsere "strings" schließlich oder?)

wenn ich zum beispiel einen char "B"

Code: Alles auswählen

strB: .string "B"
in einen vorher definierten speicherbereich

Code: Alles auswählen

.comm aStr,12,1
einkopieren möchte, dann würde ich das so probieren:

Code: Alles auswählen

movb strB, aStr(,%edi,1)
in %edi steht in diesem fall die long 11, quasi also "letzte position" im vorher definierten speicherbereich.
wenn ich das ganze so mache wird mir ein "error: invalid operation of opcode and operands" geworfen

was übersehe ich hier?

ich habe in den folien leider kein codebeispiel gefunden wie man ein long/ein byte in ein "array" oder eben einen speicherbereich kopieren kann.

ich hoffe mal auf hilfe und wünsche schonmal einen guten start ins wochenende,
alex

spaci76
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 9. Mai 2009 18:27

Re: String zusammenfügen

Beitrag von spaci76 »

Wie darf man sich das Vorstellen?

Code: Alles auswählen

.data
charstring: .string "XDJGH"
.comm romanstring, 100, 1
.
.
.
.main
movl $1, %edx
movb charstring(,%edx,1), romanstring(,%edx,1)

als Quittung gibs immer ein: error: invalid combination of opcode and operands

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: String zusammenfügen

Beitrag von mw1039 »

Hi,

die Fehlermeldung ist genau richtig. Die Kombination der Operanden ist zusammen mit dem Opcode nicht erlaubt. Auf Folien 14 in Foliensatz 5 siehst du die Kombinationen die erlaubt sind. Die Notation array(,Register,1) ist nur erlaubt, wenn das Register %esi ist. Deswegen steht in dieser Tabelle M[R[E_i]*s].

Gruss,
Michael

spaci76
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 9. Mai 2009 18:27

Re: String zusammenfügen

Beitrag von spaci76 »

mw1039 hat geschrieben:Hi,

die Fehlermeldung ist genau richtig. Die Kombination der Operanden ist zusammen mit dem Opcode nicht erlaubt. Auf Folien 14 in Foliensatz 5 siehst du die Kombinationen die erlaubt sind. Die Notation array(,Register,1) ist nur erlaubt, wenn das Register %esi ist. Deswegen steht in dieser Tabelle M[R[E_i]*s].

Gruss,
Michael
Das würde ja dann dem entsprechen:

Code: Alles auswählen

movl $1, %esi
movb charstring(,%esi,1), romanstring(,%esi,1)

das führt aber zum gleichen Ergebnis. :( sorry :?: :!:

Benutzeravatar
zimpfer
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 144
Registriert: 15. Mär 2009 01:07

Re: String zusammenfügen

Beitrag von zimpfer »

In der Referenz aus Moodle steht:
Die Adressierung mit zwei M Operanden (z. B. Befehl M,M) ist nicht zulässig.
Das M steht für Memory, also einen Wert aus dem Speicher.


Du musst den ersten Wert zuerst einem Register zuweisen (z.B. %al) und dann in das Zielfeld kopieren

spaci76
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 9. Mai 2009 18:27

Re: String zusammenfügen

Beitrag von spaci76 »

zimpfer hat geschrieben:In der Referenz aus Moodle steht:
Die Adressierung mit zwei M Operanden (z. B. Befehl M,M) ist nicht zulässig.
Das M steht für Memory, also einen Wert aus dem Speicher.


Du musst den ersten Wert zuerst einem Register zuweisen (z.B. %al) und dann in das Zielfeld kopieren
Vielen Dank für den Hinweis! Soweit so gut.

Code: Alles auswählen


main:

movl $0, %edi
movb charstring(,%edi,1), %al
movb %al, romanstring(,%edi,1)

incl %edi
movb charstring(,%edi,1), %al
movb %al, romanstring(,%edi,1)
Wenn ich jetzt die ganze Charfolge raushaben will so bin ich davon ausgegangen, dass ich mit:

Code: Alles auswählen

mov $0, %edx
pushl romanstring(,%edx,2)
nun beide Chars rausbekomme. Offenbar übersehe ich da etwas da immer nur das erste Element mit ausgegeben wird. Ich habe das so interpretiert: nimm 2 bytes ab der pos %edx.

Vielen Dank für die Geduld!

spaci76
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 9. Mai 2009 18:27

Re: String zusammenfügen

Beitrag von spaci76 »

ok problem gelöst!.

vielen dank an alle beteiligten ;)

%s statt %c muss in der Ausgabe verwendet werden.

cu daniel

Antworten

Zurück zu „Archiv“