 |
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 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4709 Wohnort: ~/
|
Verfasst am: 31.08.2025, 13:09 Titel: Minimaschine |
|
|
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:
- Programm eingeben oder laden
- "Assemble" klicken
- Programm ausführen über "Starten" (kompletter Durchlauf) oder "Schritt" (Ausführen des nächsten Befehls)
- 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 |
|
 |
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 114
|
Verfasst am: 01.09.2025, 19:10 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4709 Wohnort: ~/
|
Verfasst am: 02.09.2025, 20:48 Titel: |
|
|
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.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
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.
|
|