Domanda

Ultimo semestre al college, la mia insegnante nella classe Linguaggi ci ha insegnato il linguaggio esoterico chiamato spazio bianco . Nell'interesse di imparare meglio la lingua con un programma molto occupato (midterms), ho scritto un interprete e assemblatore in Python . Un href="http://wapedia.mobi/en/Assembly_language" rel="nofollow noreferrer"> linguaggio assembly è stato progettato per facilitare la scrittura di programmi facilmente, e un programma di esempio è stato scritto con il dato di montaggio mnemonica .

Ora che è estate, un nuovo progetto è iniziato con l'essere oggettivo di riscrivere l'interprete e assembler per Whitespace 0,3, con ulteriori sviluppi a venire dopo. Dal momento che c'è così tanto tempo in più rispetto a prima di lavorare sul suo design, si sono presentati qui con un contorno che fornisce una nuova serie di mnemonici per il linguaggio assembly. Questo post è contrassegnato come un wiki per la loro discussione.

Hai mai avuto alcuna esperienza con i linguaggi di assemblaggio in passato? Ci sono state alcune istruzioni che si pensava avrebbe dovuto essere rinominato in qualcosa di diverso? Forse ti ritrovi a pensare fuori dagli schemi e con un paradigma diverso da quello in cui sono stati nominati i mnemonici? Se si può rispondere sì a una di queste domande, siete i benvenuti qui. risposte soggettive sono apprezzati!


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 elemento spinto è considerato essere lasciato dell'operatore.

add          Addition
sub          Subtraction
mul          Multiplication
div          Integer Division
mod          Modulo

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

comandi di accesso Heap guardano lo stack per trovare l'indirizzo di elementi da memorizzare o recuperati. Per memorizzare un elemento, spingere l'indirizzo allora il valore ed eseguire il comando store. Per recuperare un elemento, spingere l'indirizzo ed eseguire il comando recuperare, che porrà il valore memorizzato nella posizione in cima alla pila.

save         Store
load         Retrieve

Flow Control (IMP: [LF])

le operazioni di controllo di flusso sono anche comuni. Le subroutine sono contrassegnati da etichette, così come gli obiettivi di salti condizionati ed incondizionati, con la quale i loop possono essere implementate. I programmi devono essere terminate mediante [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 le istruzioni IO per la lettura e la scrittura di numeri e caratteri individuali. Con questi, le routine di manipolazione di stringhe possono essere scritte. Le istruzioni di lettura prendono l'indirizzo mucchio in cui memorizzare 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 si riprogettare, riscrivere o rinominare i mnemonici precedenti e per quali motivi

È stato utile?

Soluzione

  • spinta # n, per mettere in chiaro che n è un immediato.
  • "swap" è a volte "esc" o "Exch" Penso.
  • "Salva" di solito è "ST" (negozio)
  • "carico" di solito è "ld"
  • "chiamata" potrebbe anche essere "JSR" o "bl".
  • "goto" di solito è "JMP" o "bra"
  • "if = 0" è di solito "beq"
  • "se <0" è di solito "BLT"
  • "ritorno" di solito è "ret" o "BLR"
  • "uscita" è di solito "battuta d'arresto" / "hlt" nel contesto di una CPU.
  • "chr stampa" e "print int" potrebbero essere "print.c" e "print.i". Ci sono molti modi per specificare istruzioni varianti, ma di solito non è nelle operandi.

Modifica

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

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

D'altra parte, il codice stack-based di solito tratta push e pop come implicito. In questo caso, "imm n" (immediata) invece di "spinta". Poi tutte le operazioni di stack sono operazioni puramente pila, che è bello e coerente.

Non sono sicuro di come mi piacerebbe scrivere "Drop N" - la descrizione fa sembrare come "goccia 1" non equivale a "goccia", che sembra strano

.

Altri suggerimenti

Penso che il primo cambiamento che avevo propongo sta cambiando attesa e cadere a spingere e pop, rispettivamente.

Poi magari mi piacerebbe rinominare copia alla dup (credo che sia il nome più comune per questa operazione in pila linguaggi orientati).

Sono un po 'perplesso perché spesso si ha una breve spiegazione di una parola che sono diverso per mnemonico. Per esempio mnemonico è Save, la spiegazione è Store. Mnemonico è carico, spiegazione è recuperare. Incidentalmente questi sono i due mnemonico non sufficientemente spiegato. Salva cosa dove? Caricare cosa da dove? ( Modifica la questione è stata successivamente modificata per rendere questi significati chiaro)

Grazie per il post interessante.

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

In aggiunta al vostro stack, probabilmente aggiungere un "registro di stato", che contiene una varietà di diverse bandiere (come Carry, Overflow, e Zero) impostati dagli operatori arithmatic.

Vorrei poi aggiungere "se" forme che prova quelle bandiere.

vorrei aggiungere bit di scorrimento e la rotazione (sia a sinistra che a destra) le istruzioni, così come AND / OR / XOR / NON operazioni che operano sui bit.

È molto probabile che vogliono avere un qualche tipo di accesso alla memoria, a meno che non si intende le istruzioni di I / O nella memoria trattare come un flusso di valori per quel buon ol' fashioned sensazione Macchina di Turing.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top