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:

Minimaschine

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 31.08.2025, 13:09    Titel: Minimaschine Antworten mit Zitat

Ich benötige in Kürze eine Umgebung, um die Funktionsweise einer Registermaschine kennenzulernen - möglichst als portables Programm. Eigentlich würde ich gern auf diese hier zurückgreifen; sie benötigt allerdings JRE, was ich nicht voraussetzen kann. Darum habe ich die Funktionaweise des Programms in FreeBASIC "nachgebaut".



Ein paar Anmerkungen dazu:

  • Ich hatte kein allzu großes Interesse, mich ausgiebig mit der GUI zu beschäftigen. Sie ist eher funktional als ausgefeilt.
  • Die verwendeten Befehle sind weitestgehend dieselben wie in der Vorlage. Nicht umgesetzt habe ich SHRA und SHRAI sowie die alternativen Sprungbefehle JGT, JGE, JLT, JLE, JEQ, JNE, JOV und JOC. Es gibt keine indirekte Adressierung und keinen Stackpointerregister. (Überhaupt gibt es abgesehen vom Akkumulator keine Register.)
  • Es handelt sich um eine 16-Bit-Maschine. Die Zahlen werden als vorzeichenbehaftete SHORT angezeigt, vielleicht baue ich aber noch die Möglichkeit ein, auf die Anzeige vorzeichenloser Zahlen und Hexadezimalzahlen umzuschalten. (Gleitkommazahlen werden nicht unterstützt.)
    Zahlen können nur in Dezimalschreibweise eingegeben werden.
  • Programme werden als Textdateien (*.txt) gespeichert. Da ich keine Lust hatt, mich um seitwärtes Scrollen zu kümmern, ist die Zeilenlänge auf 40 Zeichen begrenzt. Tabulatoren werden automatisch in Leerzeichen umgewandelt. Ich wollte auch nicht viel Zeit ins Parsen stecken, daher sind die Regeln für die Namen von Marken (Sprungmarken und Variablen) sehr großzügig: Sie dürfen nicht mit einer Ziffer oder einem Bindestrich beginnen, dürfen ansonsten aber alle druckbaren ASCII- (und ANSI-)Zeichen enthalten außer dem Leerzeichen und dem Doppelpunkt.
  • Auch der Programm-Editor ist äußerst simpel. Herausgegriffene "Feature": Enter fügt eine neue Zeile ein, aber ohne Zeilenumbruch; befindet sich der Cursor vor dem ersten Nicht-Leerzeichen der aktuellen Zeile, wird die neue Zeile davor eingefügt, sonst dahinter. Die Tasten "Ende" und "Pos1" funktionieren auch; "Pos1" bewegt den Cursor vor das erste Nicht-Leerzeichen. Backspace oder Delete in einer leeren Zeile löscht diese Zeile.
    Cursor setzen per Maus funktioniert nicht, kommt aber wahrscheinlich noch.

Was die Flags betrifft - gemeint sind insbesondere das Carry-Flag und das Overflow-Flag - bin ich mir nahezu sicher, dass ich sie nicht komplett richtig umgesetzt habe; dazu waren sie mit den von mir konsultierten Quellen zu undurchsichtig. Im Wesentlichen habe ich das Overflow-Flag gesetzt, wenn sich das höchstwertige Bit durch die Operation ändert (sprich: bei einem Vorzeichenwechsel). DIV, MOD und deren "Verwandte" sowie die logischen Operatoren AND, OR usw. setzen generell keines der beiden Flags. Sollte sich da jemand besser auskennen und einen Fehler in meiner Umsetzung finden, nehme ich Verbesserungsvorschläge natürlich gern entgegen.

Bedienung:

  1. Programm eingeben oder laden
  2. "Assemble" klicken
  3. Programm ausführen über "Starten" (kompletter Durchlauf) oder "Schritt" (Ausführen des nächsten Befehls)
  4. Zum erneuten Ausführen zunächst noch einmal "Assemble" klicken, um Speicher und Befehlszähler zu reinitialisieren.


Lange Rede, kurzer Link:
https://users.freebasic-portal.de/nemored/minimaschine.7z
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 114

BeitragVerfasst am: 01.09.2025, 19:10    Titel: Antworten mit Zitat

Dieses Beispiel hat einen Fehler in Zeile 3:
Code:
LOAD   1                               
ADDI   2                               
MULI   2                               
HOLD

Diese beiden Beispiele funktionieren:
Summe.txt:
Code:
# Summe mittels wiederholter Addition
# Summe = 1+2+3+...+n

Start:               # Schleifenstart
    LOAD    Summe    # Summe laden
    ADD     n        # n addieren
    STORE   Summe    # Summe speichern

    LOAD    n        # n laden
    SUBI    1        # n um 1 vermindern
    JMPNP   Ende     # Ende, wenn n <= 0
    STORE   n        # n speichern
    JMP     Start

Ende:
    LOAD    Summe    # Ergebnis in Akku
    HOLD             # Maschine anhalten

# Datenteil
n:          WORD  100
Summe:      WORD  0  # Ergebnis

Summe_Summenformel.txt:
Code:
# Summe mittels Summenformel
# Summe = 1+2+3+...+n = n*(n+1)/2

Start:             # Schleifenstart
   LOAD   n        # n laden
   MODI   2        # Wenn n gerade, dann
   JMPZ   gerade   # springe zu gerade

   LOAD   n        # n ist ungerade
   STORE  Summe    # In Summe speichern
   ADDI   1        # Akku um 1 erhoehen,
   SHRI   1        # durch 2 teilen
   JMP    Ende     # Zu Ende springen

gerade:            # n ist gerade
   LOAD   n        # n laden
   SHRI   1        # Akkuinhalt durch 2
   STORE  Summe    # In Summe speichern
   LOAD   n        # n laden
   ADDI   1        # Um 1 erhoehen

Ende:
   MUL    Summe    # Produkt bilden
   STORE  Summe    # In Summe speichern
                   # Summe steht im Akku
   HOLD            # Maschine anhalten

# Datenteil
n:        WORD  100
Summe:    WORD  0  # Ergebnis

Nachtrag: Nach Beenden und Neustart von minimaschine zeigt das erste Beispiel keinen Fehler mehr.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 02.09.2025, 20:48    Titel: Antworten mit Zitat

hhr hat Folgendes geschrieben:
Dieses Beispiel hat einen Fehler in Zeile 3:
Code:
LOAD   1                               
ADDI   2                               
MULI   2                               
HOLD

Die recht unspezifische Meldung "Fehler in Zeile X" sollte nur auftreten, wenn die Zeile einen Fehler in der Syntax hat. War die Zeile rot gefärbt?
Jedenfalls danke fürs Testen. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
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 -> Projektvorstellungen 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