|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AntonEngelmann
Anmeldungsdatum: 15.12.2023 Beiträge: 9 Wohnort: Oberbayern
|
Verfasst am: 11.04.2024, 20:53 Titel: Beispielprogramm aus dem freebasic-Portal, das nicht läuft |
|
|
Hallo!
Ich habe noch nie etwas in Assembler programmiert, bin aber dennoch neugierig und habe deswegen erst einmal mir den Assemblertext in der Funktion Revers aus dem FB-Archiv angesehen.
https://www.freebasic-portal.de/code-beispiele/string-funktionen/asm-text-revers-srever-txet-28.html
Zu meinem Erstaunen läuft das Beispielprogramm aber nicht.
Fehlermeldung:
REVERSviaASM.asm: Assembler messages:
REVERSviaASM.asm:37: Error: invalid use of operator "lt"
(Ich habe das Programm umbenannt in REVERSviaASM.bas)
Was muß korrigiert werden?
Die Funktion (à la MIRROR$() in Omikron.BASIC auf dem Atari) könnte ich gebrauchen, vor allem in einer besonders schnellen Version. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1236 Wohnort: Ruhrpott
|
Verfasst am: 11.04.2024, 22:17 Titel: |
|
|
Hallo AntonEngelmann,
das sieht mir auf den ersten Blick nach einem 32/64 bit-Problem aus. Versuche mal, beim DIMensionieren von lt INTEGER durch LONG zu ersetzen. Das könnte das Problem lösen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
AntonEngelmann
Anmeldungsdatum: 15.12.2023 Beiträge: 9 Wohnort: Oberbayern
|
Verfasst am: 12.04.2024, 00:02 Titel: |
|
|
Gruß und Dank, grindstone, für die prompte Antwort.
Leider funktioniert das Programm auch mit LT als LONG oder ULONG nicht. Bevor ich damit zumForum kam, hatte ich sogar UBYTE probiert.
Am Freitagabend melde ich mich wieder und werde bis dahin das Programm einmal mit dem 32bit-, einmal mit dem 64bit-Compiler getestet haben. Den Prozessor meines 64bit-Rechners tausche ich allerdings nicht aus!
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1236 Wohnort: Ruhrpott
|
Verfasst am: 12.04.2024, 10:08 Titel: |
|
|
Das ist keine Frage des Prozessors, sondern des Betriebssystems. Assembler mit 32-bit-Windows und 32-bit-FB funktioniert auf jeden Fall. Inwieweit die 64-bit-Systeme (Windows oder Linux) abwärtskompatibel sind, weiß ich nicht, ich lese nur häufig im internationalen Forum, daß es mit dem Assembler der 64-bit-FB - Version Probleme gibt.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 104
|
Verfasst am: 12.04.2024, 10:27 Titel: |
|
|
Anscheinend ist lt bei neueren asm-Versionen ein Operator: less than, kleiner als
Im Beispiel kann man lt zum Beispiel durch l ersetzen.
Mit l als long funktioniert es auch mit FB64. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1236 Wohnort: Ruhrpott
|
Verfasst am: 12.04.2024, 10:59 Titel: |
|
|
Ich habe mal ein bisschen mit dem Code herumgespielt. Von der Geschwindigkeit her ist Assembler unschlagbar, aber auch mit FB-Bordmitteln lässt sich eine Spiegelungsfunktion programmieren, die dem kaum nachsteht: Code: | Function Revers (ByVal txt As String) As string
Dim lt As Integer
Dim Text As String
Text = txt
lt = Len(Text)
If lt > 1 Then
asm
mov eax, [Text] 'Anfang des String im RAM
mov ebx, [lt] 'Laenge des String
mov esi, eax
add eax, ebx
dec eax
mov edi, eax 'letzes Zeichen des String
mov ecx,ebx
shr ecx 'ecx =lt \ 2 ;Laufvariable
lnext:
mov al, [esi] 'al = Anfang
mov ah, [edi] 'ah = Ende
mov [edi], al 'Ende = al
mov [esi], ah 'Anfang = ah
inc esi 'Anfang + 1
dec edi 'Ende - 1
loop lnext 'wie for .. next
End asm
End If
Function = Text
End Function
Function revers2 (txt As String) As String
Dim As Integer lt = Len(txt) - 1
Dim As String text = txt
For x As Integer = 0 To lt
text[lt - x] = txt[x]
Next
Function = text
End Function
Function revers3(txt As String) As String
Dim As Integer lt = Len(txt) - 1
Dim As String text = txt
For x As Integer = 0 To (lt+1)/2 - 1
Swap text[lt - x], text[x]
Next
Function = text
End Function
Dim t As String
t = "Dieser Text wird gespiegelt. Das ist 'just for fun' oder zum Verschluesseln?"
Print Revers(" !dlroW olleH ")
Print revers2(" !dlroW olleH ")
Print revers3(" !dlroW olleH ")
Print Revers (t)
Print revers2 (t)
Print revers3 (t)
Print t
Dim As Double timerem
Dim As Integer x
?
timerem = Timer
For x = 1 To 1000000
Revers(t)
Next
? Timer - timerem
timerem = Timer
For x = 1 To 1000000
Revers2(t)
Next
? Timer - timerem
timerem = Timer
For x = 1 To 1000000
Revers3(t)
Next
? Timer - timerem
Sleep
End
|
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 104
|
Verfasst am: 12.04.2024, 14:49 Titel: |
|
|
Ich verwende FreeBASIC-1.10.1-winlibs-gcc-9.3.0 und musste die Änderungen machen, die ich weiter oben beschrieben habe.
Die Anzahl der Schleifendurchläufe habe ich mit 10 multipliziert ( 0 angehängt ) und habe folgende Ergebnisse in Sekunden:
Code: |
gas32 gcc32 gcc64 gas64
----- ----- ----- -----
Revers : 7,889 8,219 6,644 6,879
revers2: 7,644 8,524 7,049 6,991
revers3: 9,171 8,696 6,879 7,028
----- ----- ----- -----
Revers : 7,782 8,045 6,548 6,649
revers2: 7,936 8,937 7,157 6,67
revers3: 9,021 8,989 7,031 6,969
----- ----- ----- -----
Revers : 7,842 8,308 6,83 6,85
revers2: 7,62 8,87 7,228 6,872
revers3: 9,162 8,872 7,215 6,972
----- ----- ----- -----
|
Bei einer älteren FB-Version brauchte ich die Änderungen nicht zu machen. Vielleicht hat man auch nur die Fehlerbehandlung geändert. |
|
Nach oben |
|
|
AntonEngelmann
Anmeldungsdatum: 15.12.2023 Beiträge: 9 Wohnort: Oberbayern
|
Verfasst am: 12.04.2024, 22:05 Titel: |
|
|
Guten Abend!
Grindstone, ich habe dein Programm „ReversGrindstone“ benannt und darin die Variable LT in LENtext umbenannt.
Dann mit dem 64bit-Compiler laufen lassen.
Die Umbenennung (Danke, hhr!) ersparte mir die Fehlermeldung von wegen LT sei Bezeichner für einen Operator.
Resultat war trotzdem erst einmal die folgende Fehlermeldung:
ReversGrindstone.asm:62: Error: incorrect register `ebx‘ used with `q‘ suffix
Dieselbe Fehlermeldung auch beim Test des aus der er FreeBASIC-Referenz (Stichwort: ASM) entnommenen Beispielprogramms „Funktion Mal“.
Als nächstes ein Versuch mit ReversGrindstone ohne die Funktion mit ASM, also nur mit Revers2 und Revers3: Revers3 mit SWAP ist schneller als Revers2: 0,60 : 0,75.
Dann habe ich beide Programme mit dem 32bit-Compiler laufen lassen.
Zuerst „Funktion Mal“: Es läuft und erledigt seine Multiplikationsaufgabe perfekt.
Sodann ReversGrindstone mit der Funktion mit ASM. Endlich macht es alles richtig.
Assembler ist wie erwartet am schnellsten: 0,59
Funktion Revers2 (ohne SWAP) kommt auf: 0,69
Funktion Revers2 (mit SWAP) kommt auf: 0,65 d.i. um 0,05 langsamer als mit dem 64bit-Compiler
Fazit: Mit dem 32bit-Compiler ungeachtet des 64bit-Prozessors funktionieren vom Assembler zumindest die paar Befehle, die in den beiden Beispielprogrammen enthalten sind, mit dem 64bit-Compiler gerät man an eine Fehlermeldung, die zumindest ich ASM-Laie noch nicht verstehe.
Eine Bemerkung noch am Rande:
Auch ich habe mit reinem BASIC-Werkzeug mir eine MIRROR$-Funktion geschrieben, dabei MID() benutzt. An sich ist mir die Benutzung der eckigen Klammern bei Strings zwar geläufig, der Gedanke an deren Anwendung ist mir in diesem Fall aber nicht gekommen.
Erst einmal vielen Dank, grindstone. Wenn es neue Erkenntnisse oder Fortschritte bei ASM mit dem 64bit-Compiler gibt, würde ich gern davon erfahren.
Kann mein Resultat daran liegen, daß ich alles in meinem freeBASIC-Ordner unverändert ließ und nur eine Kopie des 64bit-Compilers statt einer Kopie des 32bit-Compilers als fbc.exe benannt habe? Hätte ich auch an den Libraries etwas verändern müssen? (Ordner lib: Größe 174 MB, 1304 Dateien)
Vielleicht helfen die Erörterungen zu diesem Thema manchem anderen FreeBASIC-Anwender weiter! |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 104
|
Verfasst am: 12.04.2024, 22:17 Titel: |
|
|
Wenn es mit FB64 laufen soll, musst Du LENtext als Long deklarieren.
Dann funktioniert es mit FB64 genauso wie mit FB32. |
|
Nach oben |
|
|
AntonEngelmann
Anmeldungsdatum: 15.12.2023 Beiträge: 9 Wohnort: Oberbayern
|
Verfasst am: 12.04.2024, 22:28 Titel: |
|
|
Danke, hhr, für die Erinnerung!
Das habe ich jetzt gemacht und auch in Function Mal die Übergabevariablen auf Long abgeändert. Auf einmal funktioniert alles.
Vielen Dank für deine und grindstones freundliche Beschäftigung mit meinem Thema.
Gruß |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 104
|
Verfasst am: 12.04.2024, 22:48 Titel: |
|
|
Dazu muss ich noch was sagen.
Integer verwendet man nur für Adressen.
FB32 verwendet 32Bit Adressen, FB64 verwendet 64Bit Adressen.
Wenn man Integer für Adressen verwendet, wird das für FB32 und FB64 automatisch umgestellt. Für alle anderen Anwendungen soll man Datentypen mit fester Länge verwenden, so erspart man sich Konflikte. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 20.04.2024, 09:06 Titel: |
|
|
Hi, hhr hat recht
hhr hat Folgendes geschrieben: | Anscheinend ist lt bei neueren asm-Versionen ein Operator: less than, kleiner als. |
lt kann als Operator interpretiert werden.
Wird auch in der Fehlermeldung angezeigt. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
|
|
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.
|
|