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:

Beispielprogramm aus dem freebasic-Portal, das nicht läuft

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AntonEngelmann



Anmeldungsdatum: 15.12.2023
Beiträge: 9
Wohnort: Oberbayern

BeitragVerfasst am: 11.04.2024, 21:53    Titel: Beispielprogramm aus dem freebasic-Portal, das nicht läuft Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 11.04.2024, 23:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AntonEngelmann



Anmeldungsdatum: 15.12.2023
Beiträge: 9
Wohnort: Oberbayern

BeitragVerfasst am: 12.04.2024, 01:02    Titel: Antworten mit Zitat

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!

lachen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 12.04.2024, 11:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 88

BeitragVerfasst am: 12.04.2024, 11:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 12.04.2024, 11:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 88

BeitragVerfasst am: 12.04.2024, 15:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AntonEngelmann



Anmeldungsdatum: 15.12.2023
Beiträge: 9
Wohnort: Oberbayern

BeitragVerfasst am: 12.04.2024, 23:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 88

BeitragVerfasst am: 12.04.2024, 23:17    Titel: Antworten mit Zitat

Wenn es mit FB64 laufen soll, musst Du LENtext als Long deklarieren.
Dann funktioniert es mit FB64 genauso wie mit FB32.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AntonEngelmann



Anmeldungsdatum: 15.12.2023
Beiträge: 9
Wohnort: Oberbayern

BeitragVerfasst am: 12.04.2024, 23:28    Titel: Antworten mit Zitat

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. lächeln

Vielen Dank für deine und grindstones freundliche Beschäftigung mit meinem Thema.

Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 88

BeitragVerfasst am: 12.04.2024, 23:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
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