2010-05-25 10 views
5

Letztes Semester in der Schule lehrte mich mein Lehrer in der Computersprache-Klasse die esoterische Sprache genannt Whitespace. Im Interesse des Erlernens der Sprache besser mit einem sehr vollen Zeitplan (Midterms), schrieb ich eine interpreter und assembler in Python. Ein assembly language wurde entworfen, um das Schreiben von Programmen leicht zu erleichtern, und ein sample program wurde mit der gegebenen Baugruppe mnemonics geschrieben.Haben Sie Vorschläge für diese Montage Mnemonics?

Jetzt, da es Sommer ist, hat ein neues Projekt begonnen mit dem Ziel, den Interpreter und Assembler für Whitespace 0.3 neu zu schreiben, mit weiteren Entwicklungen, die danach kommen. Da es so viel mehr Zeit als zuvor gibt, um an seinem Design zu arbeiten, werden Sie hier mit einem Überblick vorgestellt, der eine überarbeitete Menge von Mnemotechniken für die Assembler-Sprache bereitstellt. Dieser Beitrag ist als Wiki für ihre Diskussion markiert.

Hatten Sie jemals Erfahrungen mit Assemblersprachen in der Vergangenheit? Gab es Anweisungen, von denen Sie dachten, dass sie in etwas anderes umbenannt werden sollten? Hast du dich über den Tellerrand hinaus und mit einem anderen Paradigma als in dem die Mnemotechniken benannt wurden? Wenn Sie eine dieser Fragen mit Ja beantworten können, sind Sie hier herzlich willkommen. Subjektive Antworten werden geschätzt!


Stapelmanipulations (IMP: [Leer])

Stapelmanipulations ist einer der häufigsten Operationen, daher der Kürze der IMP [Leer]. Es gibt vier Stapelanweisungen.

hold N  Push the number onto the stack 
copy   Duplicate the top item on the stack 
copy N  Copy the nth item on the stack (given by the argument) onto the top of the stack 
swap   Swap the top two items on the stack 
drop   Discard the top item on the stack 
drop N  Slide n items off the stack, keeping the top item 

Arithmetic (IMP: [TAB] [Leerzeichen])

Arithmetische Befehle operieren auf den beiden oberen Elemente auf dem Stapel, und ersetzen sie durch das Ergebnis der Operation. Der erste gedrückte Gegenstand wird als vom Bediener links betrachtet.

add   Addition 
sub   Subtraction 
mul   Multiplication 
div   Integer Division 
mod   Modulo 

Heap Access (IMP: [Tab] [Tab])

Heap-Zugriffsbefehle auf dem Stapel sehen die Adresse der Elemente zu finden, gespeichert oder abgerufen werden. Um ein Element zu speichern, drücken Sie die Adresse und dann den Wert und führen Sie den Speicherbefehl aus. Um ein Element abzurufen, drücken Sie auf die Adresse und führen Sie den Befehl retrieve aus. Dadurch wird der Wert an der Position oben im Stapel gespeichert.

save   Store 
load   Retrieve 

Flow Control (IMP: [LF])

Strömungssteueroperationen sind ebenfalls üblich. Subroutinen sind durch Labels gekennzeichnet, ebenso wie die Ziele von bedingten und unbedingten Sprüngen, mit denen Schleifen implementiert werden können. Programme müssen mit [LF] [LF] [LF] beendet werden, damit der Interpreter sauber beenden kann.

L:   Mark a location in the program 
call L  Call a subroutine 
goto L  Jump unconditionally to a label 
if=0 L  Jump to a label if the top of the stack is zero 
if<0 L  Jump to a label if the top of the stack is negative 
return  End a subroutine and transfer control back to the caller 
halt   End the program 

I/O (IMP: [Tab] [LF])

Schließlich müssen wir mit dem Benutzer interagieren zu können. Es gibt IO-Anweisungen zum Lesen und Schreiben von Zahlen und einzelnen Zeichen. Mit diesen können String-Manipulationsroutinen geschrieben werden. Die Leseanweisungen nehmen die Heap-Adresse, in der das Ergebnis von der Oberseite des Stapels gespeichert wird.

print chr Output the character at the top of the stack 
print int Output the number at the top of the stack 
input chr Read a character and place it in the location given by the top of the stack 
input int Read a number and place it in the location given by the top of the stack 

Frage: Wie würden Sie neu zu gestalten, neu zu schreiben oder die bisherigen Mnemotechnik umbenennen und aus welchen Gründen?

+5

Heiliger Mist, ein Whitespace Assembler? Ich glaube, dein Geek-O-Meter ist einfach auf elf gestiegen! – Martin

Antwort

2
  • Drücken Sie #n, um deutlich zu machen, dass n eine unmittelbare ist.
  • "swap" ist manchmal "exc" oder "exch" denke ich.
  • "speichern" ist in der Regel "st" (Speicher)
  • "Last" ist in der Regel "ld"
  • "call" auch "JSR" oder "bl" sein könnte.
  • "goto" ist in der Regel "jmp" oder "BH"
  • "if = 0" in der Regel ist "beq"
  • "wenn < 0" ist in der Regel "BLT"
  • "return" ist in der Regel " ret "oder" blr "
  • " Exit "ist in der Regel" Halt "/" Hlt "im Kontext einer CPU.
  • "print chr" und "print int" könnte "print.c" und "print.i" sein. Es gibt viele Möglichkeiten, Befehlsvarianten zu spezifizieren, aber normalerweise nicht in den Operanden.

EDIT:

Wenn Sie nichts dagegen haben, Opcodes conflating und Adressierungsarten, mit CISCy Syntax,

  • "push (sp)" anstelle von "Kopie"
  • "push N (sp)" anstelle von "copy N" (Modulo multipliziert mit der Wortgröße)
  • "push * (sp)" anstelle von "load" (außer dass ein Pop vor dem Drücken der geladenen Werte)
  • "pop * 1 (sp)" anstelle von "Push" (außer es zweimal tatsächlich erscheint)

Auf der anderen Seite, Stack-basierten Code in der Regel behandelt schieben und als implizite Pop. In diesem Fall "imm n" (sofort) statt "push". Dann sind alle Stapeloperationen reine Stapeloperationen, was nett und konsistent ist.

Ich bin mir nicht sicher, wie ich "drop N" schreiben würde - die Beschreibung klingt wie "drop 1" ist nicht gleichbedeutend mit "drop", was seltsam scheint.

+0

Danke! Die Halteanweisung war ursprünglich gedrückt, und die Anweisung zum Ablegen war ursprünglich weg. Pop wurde in Betracht gezogen, aber weder Push noch Pop beschreiben die Operation sehr gut (obwohl sie Standard sind). Ihr Vorschlag, den Ausgang in Halt zu ändern, ist sinnvoll. "print chr" ist eine Anweisung: sie hat keinen Operanden. Vielleicht lernt 4D zu mir zu kommen. Sie erlauben Räume in ihren Anweisungen, seltsam. :) –

+0

Es hängt davon ab, welches Paradigma Sie verwenden. Das x87 hat "fstp", was "Gleitpunktspeicherung und -pop" bedeutet, d. H. Das Speichern ist orthogonal zum Knacken (viele x87-Befehle haben "und pop" -Varianten). Hinzufügen einer Bearbeitung ... –

+0

Von Wapedia: 'In Unix halt ist der Befehl zum Herunterfahren des Computers. In der x86-Assemblersprache ist HLT eine Anweisung, die die CPU anhält, bis der nächste externe Interrupt ausgelöst wird. Das kann später nützlich sein, wenn Whitespace in weiteren Versionen entwickelt wird. Ein Interrupt-System in die Sprache zu programmieren wäre eine großartige Lernerfahrung. –

4

Ich denke, die erste Änderung, die ich vorschlagen würde, ist das Ändern von Hold und Drop, um zu pushen bzw. zu poppen.

Dann würde ich vielleicht Kopie in dup umbenennen (ich denke, das ist der gebräuchlichste Name für diese Operation in Stack-orientierten Sprachen).

Ich bin ein wenig verwirrt, warum oft Sie kurz ein Wort Erklärungen haben, die verschiedene zu der Mnemonic sind. Zum Beispiel ist Mnemonic Save, Erklärung ist Store. Mnemonic is Load, Erklärung lautet Retrieve. Das sind übrigens die beiden Mnemonics, die mir nicht ausreichend erklärt werden. Speichern wo? Was von wo laden? (Bearbeiten die Frage wurde anschließend bearbeitet, um diese Bedeutungen klar zu machen)

Danke für den interessanten Beitrag.

+0

Die Erklärungen stammen aus dem Tutorial hier gefunden: http://compsoc.dur.ac.uk/whitespace/tutorial.php –

1

Ich bin mir nicht sicher, ob ich deine Frage vollständig verstehe, also wenn ich von der Basis weg bin, verzeih mir.

Zusätzlich zu Ihrem Stapel würde ich wahrscheinlich ein "Statusregister" hinzufügen, das eine Vielzahl verschiedener Flags (wie Carry, Overflow und Zero) enthält, die von den arithmetischen Operatoren gesetzt werden.

Ich würde dann hinzufügen "wenn" Formulare, die diese Flags testen.

Ich würde Bit-Shift hinzufügen und drehen (sowohl nach links und rechts) Anweisungen, sowie UND/OR/XOR/NOT-Operationen, die auf Bits arbeiten.

Sie werden höchstwahrscheinlich eine Art von Speicherzugriff haben wollen, es sei denn, Sie beabsichtigen, die E/A-Anweisungen Speicher als einen Strom von Werten für das gute alte Turing Machine-Gefühl zu behandeln.

+0

Da ich nicht die Sprache geschrieben habe und beabsichtige, gerade den Interpreter für Version 0.3 der Sprache neu zu schreiben, Optionen zum Ändern sind begrenzt. Wenn alles gut geht, kann ich mir erlauben, kleine Änderungen am Befehlssatz vorzunehmen und mich hauptsächlich auf den Assemblercode für die Erweiterungsversion 0.4 der Sprache zu konzentrieren. Fortfahrend würde sich Version 0.5 wahrscheinlich auf den Befehl konzentrieren und eine viel größere Überholung der Whitespace-Anordnung beinhalten. Darüber hinaus ist es ein kleines zusätzliches Ziel, die Sprache von der Verwendung von drei Leerzeichen auf alle sechs Leerzeichen zu verschieben. –