Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

ASM - Stringmanipulation (strings verketten)
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 27.07.2007, 13:05    Titel: ASM - Stringmanipulation (strings verketten) Antworten mit Zitat

Ich brauchte noch nie grössere Stringmanipulations-Routinen in asm und habe damit deshalb kaum Erfahrungen (unter win ist das Einlesen/Ausgeben ja kein Thema an sich); ich sollte aber nun 2 Strings verketten (wie in BASIC string3=string1+string2) und habe keine Ahnung wie angehen; ich denke kaum dass ich jedes Zeichen in einen Speicherbereich kopieren muss, in einer Schleife bis der String fertig ist (Zähler mit der Länge) und dann der 2. String genau so an den anschliessenden Teil des Speicherbereiches? Oder geht das nicht einfacher; hat ev. jemand ein Beispiel?

Danke!

EDIT habe versucht in FreeBASIC zu schreiben und den ASM-Code anzusehen aber wie vermutet ruft dies nur eine Funktion "call _fb_StrAssign@20" bzw. "_fb_StrConcatAssign@20" auf.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 27.07.2007, 13:26    Titel: Antworten mit Zitat

Hallo c.m.obrecht! lächeln

Meine Lösung hat noch kleine Konstrukte für DOS drumrum (z.B. das Beenden des Programms), den eigentlich Code kannst du jedoch vermutlich rausfiltern. lächeln

Code:

; Basis-Adresse (für DOS) 0x100
[ORG 0x100]

; ----------------

; Pointer auf String1 in SI laden
   mov si, String1
; Das 0-Byte finden, das das Ende des 1. Strings anzeigt
FindLastByte:
   lodsb
   or al, al
   jnz FindLastByte

; Pointer auf String1 aus SI in DI
; (Zuvor SI noch um eins verringern, da das 0-Byte bereits gelesen wurde (soll überschrieben
; werden, stosb/lodsb erhöhen den Pointer SI/DI jeweils nach dem Ausführen um 1)
   dec si
   mov di, si
; Pointer auf String2 in SI laden
   mov si, String2
; Byte aus String2 laden, auf Ende überprüfen, und ggf. anhängen
CatStrings:
   lodsb
   or al, al
   jz .Done
   stosb
   jmp CatStrings

; Strings sind prinzipiell verkettet, es muss jedoch noch das Dollar-Zeichen ($)
; zur Begrenzung innerhalb von DOS (wie ist es in Windows?) angehangen werden
.Done:
   mov al, '$'
   stosb

; ----------------

; Den String zu guter letzt noch ausgeben :)
   mov ah, 0x09
   mov dx, String1
   int 0x21

; ----------------

; Das Programm beenden
   mov ah, 0x4C
   int 0x21
   
; Für ausreichend Platz beim Verketten sorgen, sonst Buffer-Overflow!!
String1 db "Hello", 0, 0, 0, 0, 0, 0, 0, 0
String2 db " World!", 0


Viel Spaß damit,
Mao lächeln
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 27.07.2007, 14:01    Titel: Antworten mit Zitat

ich versuchte es mal mit dem Inline-Assembler von FB.
Code:
 dim as string String1
dim as string String2
String1="Hello"
String2=" world"
sleep
asm
   
 mov si, String1

FindLastByte:
   lodsb
   or al, al
   jnz FindLastByte


 
   dec si
   mov di, si

   mov si, String2

CatStrings:
   lodsb
   or al, al
   jz .Done
   stosb
   jmp CatStrings


.Done:
   mov al, "$"
   stosb 
end asm
print string1
sleep


Das Programm stürzt ab: http://www.homepage.hispeed.ch/reben/absturz.JPG
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 27.07.2007, 15:16    Titel: Antworten mit Zitat

Probier mal ZSTRING*20 (oder so ähnlich) statt STRING.

(Ich kann leider nicht Probieren, ich bekomm schon vom Compiler Fehlermeldungen)
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 27.07.2007, 16:46    Titel: Antworten mit Zitat

Code:
zstring*20="Hello"
?
Da wird zstring gar nicht erkannt, bekomme ich auch vom Compiler eine Fehlermeldung.

Es sollte natürlich später in masm32 laufen, mit nullterminierten Strings welche im Programm schon definiert und benützt werden.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 27.07.2007, 16:53    Titel: Antworten mit Zitat

Code:
 dim as zstring*20 String1
dim as zstring*20 String2

statt
Code:
 dim as string String1
dim as string String2


c.m.obrecht hat Folgendes geschrieben:
Es sollte natürlich später in masm32 laufen, mit nullterminierten Strings welche im Programm schon definiert und benützt werden.

Dann stimmt meine Vermutung wahrscheinlich, denn String von Freebasic ist Dynamisch und du pfuscht entweder am Header rum (der Enthält den Pointer zum Eigentlichen String und die Länge) oder überschreibst Bereiche die nicht für den String reserviert ist.
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 27.07.2007, 18:31    Titel: Antworten mit Zitat

habe ich nun so gemacht (steht das z für zero? Kannte diese Definitionen gar nicht für BASIC!) aber es kam wieder:
fbidetemp.exe hat ein Problem festgestellt und muss beendet werden.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 27.07.2007, 18:40    Titel: Antworten mit Zitat

c.m.obrecht hat Folgendes geschrieben:
steht das z für zero? Kannte diese Definitionen gar nicht für BASIC!
Ja steht es. ZStrings sind ja nullterminiert.
Bei WStrings steht es für "Wide" - "weit" also weitbereichsstring. zwinkern
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 27.07.2007, 18:44    Titel: Antworten mit Zitat

Ach soo, BASIC bietet auch manchmal Überraschungen lächeln Geht das auch in VB?
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 27.07.2007, 20:23    Titel: Antworten mit Zitat

Zu der VB-Frage kann ich keine Antwort geben...
Mit dem String-Header oder was weiß ich, wie FB das verwaltet, kann ich dir leider nix sagen. Allerdings ließ sich oben gezeigtes erstes Beispiel von dir auch nicht assemblieren. zwinkern
Du müsstest dir den Speicher wahrscheinlich mit Allocate() besorgen. Wenn ich manuell ein Null-Byte noch zusätzlich setze (FB so arbeitet auch mit nullterminierten Strings, allerdings etwas anders; sie sind halt dynamisch), dann schneidet mir der Compiler (aus eigentlich gut gemeinten Optimierungsgründen) hinten alles ab. Beispiel:
Code:

Dim As String String1="Hello"+!"\0"+" World!"

Das " World!" befände sich nicht mehr im Assembler-Listing, weil automatisch von FB nach Terminierung des Strings ja auch eigtl. sinnlos.

Vom Inline-Assembler hat volta jedenfalls 'ne menge Ahnung (öhm...das heißt, ich hab schon das ein oder andere mal coole Listings von ihm hier im Forum gefunden). lächeln

Allerdings:
@csderats: WideStrings sind keine "weitbereich-Strings". durchgeknallt Sie decken höchstens einen weiten Bedarf an zusätzlichen Zeichen ab, da 1 Word zur Speicherung eines Zeichens verwendet wird, statt 1 Byte.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 27.07.2007, 20:51    Titel: Antworten mit Zitat

Mao hat Folgendes geschrieben:
@csderats: WideStrings sind keine "weitbereich-Strings". durchgeknallt Sie decken höchstens einen weiten Bedarf an zusätzlichen Zeichen ab, da 1 Word zur Speicherung eines Zeichens verwendet wird, statt 1 Byte.
Im gewissen Grunde sind sie das schon: Sie decken einen weiten Bereich an Zeichen ab. So war das auch gemeint zwinkern
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 27.07.2007, 20:55    Titel: Antworten mit Zitat

Klang aber eher nach Übersetzung + Phantasie. Zunge rausstrecken
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 27.07.2007, 22:51    Titel: Antworten mit Zitat

So geht es in FB-Inline!
Sieht ein wenig kompliziert aus, da es mit Strings (auch ZStrings) in FB nicht geht
(da werden dann Speichergrenzen überschrieben und das gibt Fehlermeldungen).
Code:
Dim As Zstring Ptr spa, spb
'überlasse ich FB die Stringverwaltung gehts nicht??
Asm
  .section .Data
  .balign 4
  testa: .asciz "Hello"
  .ascii "          " 'hier wird hineingeschrieben
 
  .balign 4
  testb: .asciz " World"

  .text
  .balign 16
  lea esi, testa
  mov [spa], esi
  lea esi, testb
  mov [spb], esi
End Asm
?*spa
?*spb

'esi, edi verwenden, da 32Bit ;)
Asm
  .balign 16
  lea esi, testa
 FindLastByte:
  lodsb
  Or al, al
  jnz FindLastByte
 
  dec esi
  mov edi, esi
  lea esi, testb
 CatStrings:
  lodsb
  Or al, al
  jz Done
  stosb
  jmp CatStrings
 
 Done:
  mov al, 0 'Nullterminiert
  stosb
End Asm

?spa[0] 'das gleiche wie '?*spa'
?spb[0]
Sleep
End
grinsen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 28.07.2007, 08:28    Titel: Antworten mit Zitat

Um noch auf das Format des Freebasic String zu referenzieren:
Wikibooks, Kapitel Pointer, Abschnitt Pointer auf Strings

Der "normale" String von Freebasic ist auch Nullteminiert, damit man ihn wie einen ZString lesen kann.
Aber man kann einen "normalen" String nicht wie einen ZString schreiben, weil man damit der Speicher- und Stringverwaltung von Freebasic in beinahe jeden Fall reinfunkt. (Die Ausnahme: Länge des Strings bleibt genau gleich)

Edit:
Referenz zu anderem Problem mit String:
http://forum.qbasic.at/viewtopic.php?p=59678
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 28.07.2007, 23:40    Titel: Antworten mit Zitat

Ah soo... danke!
Die 2. Version geht allerdings in MASM32 nicht (hat ja nicht nur ASM-Befehle, z.B. Zeiger ?*spa ?*spb...
aber werde mal die 1. Version versuchen in MASM32, wer weiss wenn das das Problem ist könnte es ja ev. gehen...
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 29.07.2007, 12:50    Titel: Antworten mit Zitat

nein, das sind nicht 2 Versionen, das gehört schon zusammen!
Ob der folgende Code unter MASM32 läuft weis ich nicht genau?
Code:
  jmp Start
  .balign 4
  testa: .asciz "Hello"
  .ascii "          " 'hier wird hineingeschrieben
 
  .balign 4
  testb: .asciz " World"

 Start:
  .balign 16
  lea esi, testa
 FindLastByte:
  lodsb
  Or al, al
  jnz FindLastByte
 
  dec esi
  mov edi, esi
  lea esi, testb
 CatStrings:
  lodsb
  Or al, al
  jz Done
  stosb
  jmp CatStrings
 
 Done:
  mov al, 0 'Nullterminiert
  stosb

' ***Hier fehlt noch die PRINT-Routine!!***

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 01.08.2007, 16:02    Titel: Antworten mit Zitat

Werde ich mal versuchen, danke!

Eine API-Funktion dafür gibt es nicht?
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 01.08.2007, 16:22    Titel: Antworten mit Zitat

c.m.obrecht hat Folgendes geschrieben:
Eine API-Funktion dafür gibt es nicht?

Wieso sollte es eine API Funktion geben um Strings in ASM zu kopieren?
Hast du vielleicht den Falschen Thread erwischt?
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 01.08.2007, 20:28    Titel: Antworten mit Zitat

Dachte nur, Windows bietet ja alle möglichen Funktionen an (GetShortFileName hat mich auch erstaunt, dachte das müsse man programmieren) - und das ist ja etwas relativ häufig gebrauchtes.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 02.08.2007, 07:41    Titel: Antworten mit Zitat

Ich bin der Meinung das String kopieren und ähnliches so Fundemandal ist, das es von Compiler unterstützt werden muss.

Anyway, ob Sinnvoll oder nicht: StrCpy Function
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz