2010-05-25 14 views
5

Ultimo semestre al college, il mio insegnante nella classe Computer Languages ​​ci ha insegnato il linguaggio esoterico chiamato Whitespace. Nell'interesse di imparare meglio la lingua con un programma molto impegnativo (midterms), ho scritto un interpreter e assembler in Python. Un assembly language è stato progettato per facilitare la scrittura dei programmi facilmente e uno sample program è stato scritto con l'assembly specificato mnemonics.Avete suggerimenti per questi mnemonici di assemblaggio?

Ora che è estate, un nuovo progetto è iniziato con l'obiettivo di riscrivere l'interprete e l'assemblatore per Whitespace 0.3, con ulteriori sviluppi che verranno dopo. Poiché c'è molto più tempo rispetto a prima per lavorare sul suo design, qui viene presentato uno schema che fornisce un insieme rivisto di mnemonici per il linguaggio assembly. Questo post è contrassegnato come wiki per la loro discussione.

Hai mai avuto esperienze con i linguaggi di assemblaggio in passato? C'erano alcune istruzioni che pensavate avrebbero dovuto essere rinominate in qualcosa di diverso? Ti sei trovato a pensare fuori dagli schemi e con un paradigma diverso da quello in cui sono stati nominati i mnemonici? Se puoi rispondere di sì a una qualsiasi di queste domande, sei il benvenuto qui. Le risposte soggettive sono apprezzate!


Stack Manipulation (IMP: [spazio])

manipolazione Stack è una delle operazioni più comuni, quindi la brevità del PIM [Spazio]. Ci sono quattro istruzioni di stack.

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 

aritmetica (IMP: [Tab] [spazio])

comandi aritmetici operano sui primi due elementi della pila, e sostituirli con il risultato dell'operazione. Il primo oggetto spinto è considerato a sinistra dell'operatore.

add   Addition 
sub   Subtraction 
mul   Multiplication 
div   Integer Division 
mod   Modulo 

Heap di accesso (IMP: [Tab] [Tab])

comandi di accesso Heap guardano lo stack per trovare l'indirizzo di voci da memorizzare o recuperate. Per memorizzare un elemento, premere l'indirizzo, quindi il valore ed eseguire il comando store. Per recuperare un elemento, premere l'indirizzo ed eseguire il comando retrieve, che posizionerà il valore memorizzato nella posizione in cima allo stack.

save   Store 
load   Retrieve 

Flow Control (IMP: [LF])

operazioni di controllo del flusso sono anche comuni. Le subroutine sono contrassegnate da etichette e gli obiettivi dei salti condizionali e incondizionati, tramite i quali è possibile implementare i loop. I programmi devono essere terminati per mezzo di [LF] [LF] [LF] in modo che l'interprete possa uscire in modo pulito.

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])

Infine, abbiamo bisogno di essere in grado di interagire con l'utente. Ci sono istruzioni IO per leggere e scrivere numeri e singoli caratteri. Con questi, è possibile scrivere routine di manipolazione delle stringhe. Le istruzioni di lettura prendono l'indirizzo heap in cui archiviare il risultato dalla cima della pila.

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 

Domanda: Come ti ridisegnare, riscrivere o rinominare i mnemonici precedenti e per quali motivi?

+5

Holy Crap, un assemblatore di spazi bianchi? Credo che il tuo geek-o-meter sia arrivato a undici! – Martin

risposta

2
  • premere #n, per chiarire che n è un immediato.
  • "swap" è talvolta "exc" o "exch", penso.
  • "salvare" è di solito "ST" (negozio)
  • "carico" di solito è "ld"
  • "chiamata" potrebbe anche essere "JSR" o "bl".
  • "avanzamento" è solitamente "jmp" o "bra"
  • "se = 0" è solitamente "beq"
  • "se < 0" è solitamente "blt"
  • "ritorno" è solitamente " ret "o" blr "
  • " exit "è in genere" halt "/" hlt "nel contesto di una CPU.
  • "print chr" e "print int" potrebbero essere "print.c" e "print.i". Ci sono molti modi per specificare le varianti di istruzione, ma di solito non è negli operandi.

EDIT:

Se non ti dispiace confondendo codici operativi e modi di indirizzamento, utilizzando la sintassi CISCy,

  • "push (sp)" invece di "copia"
  • "push N (sp)" invece di "copia N" (modulo moltiplicando per la dimensione della parola)
  • "push * (sp)" invece di "load" (tranne che fa un pop prima di premere i valori caricati)
  • "pop * 1 (sp)" invece di "spinta" (tranne che in realtà appare due volte)

D'altra parte, codice basata su stack solitamente tratta spingere e pop come implicito. In tal caso, "imm n" (immediato) invece di "push". Quindi tutte le operazioni di stack sono operazioni puramente stack, il che è bello e coerente.

Non sono sicuro di come scrivere "drop N" - la descrizione fa sembrare che "drop 1" non sia equivalente a "drop" che sembra strano.

+0

Grazie! L'istruzione di attesa era spinta originale e l'istruzione di rilascio era originariamente lontana. È stato considerato il pop, ma né push né pop descrivono l'operazione molto bene (anche se sono standard). Il tuo suggerimento su come cambiare l'uscita per fermarsi ha senso. "print chr" è un'istruzione: non ha un operando. Forse studiare 4D mi sta arrivando. Consentono spazi nelle loro istruzioni, stranamente. :) –

+0

Dipende dal paradigma che si sta utilizzando. L'x87 ha "fstp" che significa "floating point store and pop", cioè la memorizzazione è ortogonale a popping (molte istruzioni x87 hanno varianti "e pop"). Aggiunta di una modifica ... –

+0

Da Wapedia: 'In Unix halt è il comando per spegnere il computer. In linguaggio assembly x86, HLT è un'istruzione che interrompe la CPU fino a quando viene attivato il successivo interrupt esterno. Ciò potrebbe rivelarsi utile in seguito, quando Whitespace verrà sviluppato in ulteriori versioni. Programmare un sistema di interruzione nella lingua sarebbe una grande esperienza di apprendimento. –

4

Penso che il primo cambiamento che proporrei sia quello di cambiare tenere e rilasciare rispettivamente push e pop.

Quindi forse rinominerei la copia in dup (penso che sia il nome più comune per questa operazione nei linguaggi stack oriented).

Sono un po 'perplesso perché spesso si hanno brevi spiegazioni di una parola che sono diverse da al mnemonico. Ad esempio mnemonico è Salva, la spiegazione è Store. Mnemonico è Carica, la spiegazione è Recupera. Per inciso, questi sono i due mnemonici che non mi sono sufficientemente spiegati. Salva cosa dove? Carica cosa da dove? (Modifica la domanda è stata successivamente modificata per rendere chiari questi significati)

Grazie per l'interessante post.

+0

Le spiegazioni derivano dal tutorial trovato qui: http://compsoc.dur.ac.uk/whitespace/tutorial.php –

1

Non sono sicuro di comprendere completamente la tua domanda, quindi se sono fuori base, perdonami.

Oltre allo stack, probabilmente aggiungerei un "registro di stato" che contiene una varietà di flag diversi (come Carry, Overflow e Zero) impostati dagli operatori aritmetici.

Aggiungerei quindi i moduli "if" che testano tali flag.

Vorrei aggiungere bit shift e ruotare (sia a sinistra che a destra) le istruzioni, così come le operazioni AND/OR/XOR/NOT che operano sui bit.

Probabilmente vorrete avere una sorta di accesso alla memoria, a meno che non intendiate le istruzioni di I/O per trattare la memoria come un flusso di valori per quel buon vecchio stile di Turing Machine.

+0

Poiché non ho scritto la lingua e intendo attualmente riscrivere l'interprete per la versione 0.3 della lingua, le opzioni per cambiarlo sono limitate. Se tutto va bene, potrei prendere la libertà di apportare piccole modifiche al set di istruzioni e concentrarmi principalmente sul codice assembly per la versione di estensione 0.4 della lingua. Continuando, la versione 0.5 probabilmente si concentrerebbe sull'istruzione e comporterebbe una revisione molto più ampia dell'assemblaggio degli spazi bianchi. Inoltre, spostare la lingua dall'uso di tre caratteri di spaziatura a tutti e sei i caratteri di uno spazio bianco è un piccolo obiettivo aggiuntivo. –

Problemi correlati