Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 27.07.2007, 14:05 Titel: ASM - Stringmanipulation (strings verketten) |
|
|
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 |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 27.07.2007, 14:26 Titel: |
|
|
Hallo c.m.obrecht!
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.
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 _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 27.07.2007, 15:01 Titel: |
|
|
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 |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 27.07.2007, 17:46 Titel: |
|
|
?
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 |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 27.07.2007, 17:53 Titel: |
|
|
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 |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 27.07.2007, 19:31 Titel: |
|
|
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 |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 27.07.2007, 19:40 Titel: |
|
|
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. _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 27.07.2007, 19:44 Titel: |
|
|
Ach soo, BASIC bietet auch manchmal Überraschungen Geht das auch in VB? _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 27.07.2007, 21:23 Titel: |
|
|
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.
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).
Allerdings:
@csderats: WideStrings sind keine "weitbereich-Strings". 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 |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 27.07.2007, 21:51 Titel: |
|
|
Mao hat Folgendes geschrieben: | @csderats: WideStrings sind keine "weitbereich-Strings". 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 _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 27.07.2007, 21:55 Titel: |
|
|
Klang aber eher nach Übersetzung + Phantasie. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 27.07.2007, 23:51 Titel: |
|
|
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 | _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 29.07.2007, 00:40 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 29.07.2007, 13:50 Titel: |
|
|
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 |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 01.08.2007, 17:02 Titel: |
|
|
Werde ich mal versuchen, danke!
Eine API-Funktion dafür gibt es nicht? _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 01.08.2007, 17:22 Titel: |
|
|
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 |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 01.08.2007, 21:28 Titel: |
|
|
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 |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
|
|