2010-05-25 33 views
5

Último semestre en la universidad, mi profesor en la clase de Lenguajes de Computación nos enseñó el lenguaje esotérico llamado Whitespace. Con el interés de aprender mejor el idioma con un horario muy ocupado (exámenes parciales), escribí un interpreter y assembler en Python. Un assembly language se diseñó para facilitar la escritura de programas fácilmente, y se escribió un sample program con el ensamblado dado mnemonics.¿Tiene alguna sugerencia para estos ensamblajes mnemotécnicos?

Ahora que es verano, un nuevo proyecto se ha iniciado con el objetivo de volver a escribir el intérprete y el ensamblador de espacios en blanco 0.3, con los nuevos acontecimientos que viene después. Dado que hay mucho más tiempo que antes para trabajar en su diseño, se le presenta aquí un esquema que proporciona un conjunto revisado de mnemónicos para el lenguaje ensamblador. Esta publicación está marcada como wiki para su discusión.

¿Alguna vez ha tenido alguna experiencia con los lenguajes de ensamblaje en el pasado? ¿Hubo algunas instrucciones que creías que deberían haber cambiado de nombre a algo diferente? ¿Te encuentras pensando fuera de la caja y con un paradigma diferente al de los nombres mnemotécnicos? Si puede responder afirmativamente a alguna de esas preguntas, es bienvenido aquí. ¡Las respuestas subjetivas son apreciadas!


Manipulación Stack (IMP: [Espacio])

manipulación Stack es una de las operaciones más comunes, de ahí la falta de la IMP [Espacio]. Hay cuatro instrucciones de pila.

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 

Aritmética (IMP: [Tab] [espacio])

comandos aritméticos operan en los dos últimos elementos en la pila, y sustituirlos por el resultado de la operación. El primer elemento empujado se considera que queda del operador.

add   Addition 
sub   Subtraction 
mul   Multiplication 
div   Integer Division 
mod   Modulo 

Montón de acceso (IMP: [Tab] [Tab])

comandos de acceso Montón miran a la pila para encontrar la dirección de temas que se almacene o se extraiga. Para almacenar un artículo, presione la dirección luego el valor y ejecute el comando de la tienda. Para recuperar un elemento, presione la dirección y ejecute el comando de recuperación, que colocará el valor almacenado en la ubicación en la parte superior de la pila.

save   Store 
load   Retrieve 

de control de flujo (IMP: [LF])

operaciones de control de flujo son también comunes. Subrutinas están marcadas por etiquetas, así como los objetivos de saltos condicionales e incondicionales, por el que las espirales se pueden implementar. Los programas deben ser terminados por medio de [LF] [LF] [LF] para que el intérprete pueda salir limpiamente.

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

Finalmente, necesitamos ser capaces de interactuar con el usuario. Hay instrucciones de IO para leer y escribir números y caracteres individuales. Con esto, se pueden escribir rutinas de manipulación de cadenas. Las instrucciones de lectura toman la dirección del montón para almacenar el resultado desde la parte superior de la 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 

Pregunta: ¿Cómo le rediseñar, volver a grabar o cambiar el nombre de los mnemónicos anteriores y por qué razones?

+5

Holy crap, un ensamblador whitespace? ¡Creo que tu geek-o-meter acaba de llegar a once! – Martin

Respuesta

2
  • push #n, para dejar en claro que n es un inmediato.
  • "swap" es a veces "exc" o "exch", creo.
  • "salvar" suele ser "c" (tienda)
  • "carga" es por lo general "LD"
  • "llamada" también podría ser "JSR" o "BL".
  • "goto" es por lo general "JMP" o "sujetador"
  • "si = 0" es por lo general "beq"
  • "si < 0" es por lo general "BLT"
  • "retorno" suele ser " ret "o" blr "
  • " exit "suele ser" halt "/" hlt "en el contexto de una CPU.
  • "print chr" e "print int" podrían ser "print.c" e "print.i". Hay muchas maneras de especificar variantes de instrucciones, pero generalmente no está en los operandos.

EDIT:

Si no le importa confundir códigos de operación y modos de direccionamiento, usando la sintaxis CISCy,

  • "empuje (sp)" en lugar de "copia"
  • "push N (sp)" en lugar de "copy N" (módulo que se multiplica por el tamaño de palabra)
  • "push * (sp)" en lugar de "cargar" (excepto que hace un pop antes de presionar los valores cargados)
  • "pop * 1 (sp)" en lugar de "empuje" (salvo que en realidad aparece dos veces)

Por otra parte, el código basado en pila por lo general trata de inserción y extracción como implícita. En ese caso, "imm n" (inmediato) en lugar de "empujar". Entonces, todas las operaciones de pila son puramente operaciones de pila, lo cual es agradable y consistente.

No estoy seguro de cómo escribiría "drop N" - la descripción lo hace sonar como "drop 1" no es equivalente a "drop" que parece extraño.

+0

¡Gracias! La instrucción de retención fue original, y la instrucción de caída fue originalmente ausente. Se consideró Pop, pero ni push ni pop describen la operación muy bien (aunque son estándar). Su sugerencia de cambiar la salida para detenerse tiene sentido. "print chr" es una instrucción: no tiene operando. Tal vez estudiar 4D me está llegando. Permiten espacios en sus instrucciones, extrañamente. :) –

+0

Depende del paradigma que estés usando. El x87 tiene "fstp", que significa "almacenamiento y almacenamiento de coma flotante", es decir, el almacenamiento es ortogonal al reventado (muchas instrucciones x87 tienen variantes "y pop"). Agregar una edición ... –

+0

De Wapedia: 'En Unix, detener es el comando para apagar la computadora. En el lenguaje de ensamblaje x86, HLT es una instrucción que detiene la CPU hasta que se active la siguiente interrupción externa. Eso puede ser útil más adelante cuando Whitespace se desarrolle en versiones posteriores. La programación de un sistema de interrupción en el idioma sería una gran experiencia de aprendizaje. –

4

Creo que el primer cambio que propongo es cambiar la opción de mantener y soltar para presionar y abrir respectivamente.

Entonces quizás cambie el nombre de copiar a dup (creo que ese es el nombre más común para esta operación en lenguajes orientados a stack).

Estoy un poco confundido por qué a menudo tienes explicaciones de una palabra corta que son diferentes al mnemónico. Por ejemplo, mnemónico es Guardar, la explicación es Tienda. Mnemónico es Load, la explicación es Retrieve. Por cierto, esas son las dos mnemotécnicas que no me explican lo suficiente. ¿Guardar qué? Cargar qué desde dónde? (Editar la pregunta ha sido editada posteriormente para aclarar estos significados)

Gracias por la interesante publicación.

+0

Las explicaciones provienen del tutorial que se encuentra aquí: http://compsoc.dur.ac.uk/whitespace/tutorial.php –

1

No estoy seguro de entender por completo su pregunta, así que si estoy fuera de la base, perdóneme.

Además de su pila, probablemente agregaría un "registro de estado" que contiene una variedad de banderas diferentes (como Carry, Overflow y Zero) que son establecidas por los operadores aritmáticos.

Luego agregaría formularios "if" que prueban esos indicadores.

Agregaría las instrucciones de cambio de bit y giro (tanto a la izquierda como a la derecha), así como las operaciones AND/OR/XOR/NOT que operan en bits.

Lo más probable es que desee tener algún tipo de acceso a la memoria, a menos que tenga la intención de que las instrucciones de E/S traten la memoria como un flujo de valores para la sensación de Turing Machine.

+0

Como no escribí el idioma y tengo la intención de reescribir el intérprete actualmente para la versión 0.3 del idioma, las opciones para cambiarlo son limitadas. Si todo va bien, puedo tomar la libertad de hacer pequeñas modificaciones al conjunto de instrucciones y enfocarme principalmente en el código de ensamblaje para la versión de extensión 0.4 del lenguaje. Continuando, la versión 0.5 probablemente se concentre en la instrucción e involucre una revisión mucho mayor del ensamblaje Whitespace. Además, mover el idioma de usar tres espacios en blanco a los seis espacios en blanco es un pequeño objetivo adicional. –

Cuestiones relacionadas