Seite 1 von 2

String zusammenfügen

Verfasst: 1. Nov 2011 16:26
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?

Re: String zusammenfügen

Verfasst: 1. Nov 2011 17:29
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.

Re: String zusammenfügen

Verfasst: 1. Nov 2011 17:51
von downsampling
Und wie macht man es in Asm?

Re: String zusammenfügen

Verfasst: 2. Nov 2011 10:29
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?

Re: String zusammenfügen

Verfasst: 2. Nov 2011 13:18
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

Re: String zusammenfügen

Verfasst: 2. Nov 2011 14:42
von Drno
Strings? Was sind Strings? ;-)

Re: String zusammenfügen

Verfasst: 3. Nov 2011 14:01
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?

Re: String zusammenfügen

Verfasst: 3. Nov 2011 17:03
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.

Re: String zusammenfügen

Verfasst: 4. Nov 2011 14:14
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

Re: String zusammenfügen

Verfasst: 4. Nov 2011 14:19
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

Re: String zusammenfügen

Verfasst: 4. Nov 2011 14:25
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

Re: String zusammenfügen

Verfasst: 4. Nov 2011 14:40
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 :?: :!:

Re: String zusammenfügen

Verfasst: 4. Nov 2011 14:45
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

Re: String zusammenfügen

Verfasst: 4. Nov 2011 15:20
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!

Re: String zusammenfügen

Verfasst: 4. Nov 2011 15:45
von spaci76
ok problem gelöst!.

vielen dank an alle beteiligten ;)

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

cu daniel