Quiero hablar sobre el procesador que desarrollé en 2016. Se implementa en C como una máquina virtual. Mi amigo Björn escribió ensamblador para él en F #.
Periwinkle es un
procesador OISC (una computadora de conjunto de instrucciones), a diferencia de RISC y CISC. No tiene tubería. De hecho, la productividad no es el objetivo principal del proyecto, se creó más por placer y con fines educativos.
A mi amiga Alena se le ocurrió el nombre de bígaro, es decir, bígaro (esta flor increíblemente tenaz se considera un símbolo de vitalidad, aproximadamente por persona).
Hay muchos tipos de instrucciones para OISC. Pero en Bígaro, esta es una declaración de movimiento. Simplemente mueva el
literal a un
registro o valor de un registro a otro. Operaciones lógicas y aritméticas, ramificaciones, etc. realizado utilizando registros.
La longitud de la instrucción Bígaro es estable de 40 bits. Bus de datos de 32 bits.

El bígaro tiene un total de 64 registros.

Aquí hay una descripción de algunos:
Contador de software (PC)
- Contador hasta 32 bit
- El tamaño de la memoria del programa es 255 palabras de 40 bits (depende de la implementación)
- Mover -1 al registro de la PC hace que el contador se detenga explícitamente
Pila de uso general (STK)
- Apilar para cualquier cosa (16 niveles de profundidad)
- Sin señal de desbordamiento y pila incompleta
- Leer una pila vacía devuelve 0
- Mover valores aquí es una operación push
- Mudarse desde aquí - operación pop
Generador de números aleatorios (RNG)
- Cuando se llama, genera un número aleatorio de 32 bits.
- Mover valores aquí parece inútil
Omitir si es cero (TAMAÑO)
- Omite la siguiente instrucción si mueve cero a ella
Saltar si no es cero (SINZ)
- Omite la siguiente declaración si le mueve un valor distinto de cero
Referencia (REF)
- Se usa para indicar una dirección basada en un valor movido
- Los valores grandes se truncan a números de 6 bits.
Dereferencia (DEF)
- Desreferenciar después de REF
Registros reservados (RSV)
- Mudarse aquí no importa. El registro seguirá conteniendo cero.
- Se puede usar para cualquier tarea al transferir una máquina virtual a un microcontrolador u otra cosa
- Para registros futuros / adicionales
- Se puede usar para eliminar un elemento de la pila de uso general y los registros operativos moviendo el elemento aquí (no recomendado)
- Al leer, devuelve 0
Registros de uso general (GPR0-GPR31)
- Puede contener números de 32 bits
Registro cero
- Puede usarse para eliminar un elemento de la pila de propósito general y los registros operativos moviendo este elemento aquí
- Devuelve 0 al leer
Registro de estado:
- 0000 0000 0000 0000 0000 0000 000P ZVNC
- Contiene cinco banderas (C, N, V, Z, P)
- Llevar
- Negativo
- Desbordamiento
- Cero
- El registro PLUS afecta a las banderas C, N, V, Z, P
- Los registros AND, OR, XOR afectan las banderas N, Z, P
- La última operación en ejecución afectará el registro de estado
- Mover el significado aquí parece inútil.
Pero, ¿cómo funcionan los registros PLUS, AND, OR, XOR? Estos cuatro registros tienen una pila peculiar, que en realidad es una pila computacional. Cuando hay dos números en la pila de cálculo, comienza la operación.

Aquí hay un ejemplo para el registro PLUS. El esquema funciona de manera similar para los otros tres registros.
Pero, ¿cómo realizar operaciones aritméticas con solo cuatro operadores? Como dije, el objetivo de este proyecto es el entretenimiento y la educación. Por lo tanto, puede sintetizar independientemente las acciones que faltan.
La sustracción se realiza sumando con
código adicional que representa números negativos. Se forma un código adicional por la inversión de bits, es decir, al presionar el número 0xFFFFFFFF (2³²-1) a través de XOR. Y agregando uno a través del registro PLUS. Sin embargo, el ensamblador admite números negativos, por lo que no es necesario hacer todo esto.
La multiplicación es solo múltiples adiciones.
La división es la cantidad de veces que se coloca un solo número en un número. Esto se puede calcular a través del contador de sustracciones secuenciales.
El cambio de bit se realiza multiplicando por 2 o dividiendo por 2.
Piense en cómo sintetizar otras operaciones usted mismo.
Si está interesado, aquí está
el repositorio github de algunos programas ensambladores que escribí para Periwinkle. La instrucción de movimiento funciona de izquierda a derecha:
#50 gpr0 // 50(base-10) gpr0 gpr0 gpr1 // gpr0 gpr1
Además, intentaré cargar el archivo ejecutable de la máquina virtual Periwinkle VM. ¿Para qué plataforma hacer la máquina virtual? (Windows (x86? X86-64?), Linux (x86? X86-64? ARM?, ARM64 ?, Etc.?), Etc.?) Dado que el ensamblador está escrito en F #, probablemente pueda funcionar en todas partes , solo necesita el
marco .NET , puede echar un vistazo a
Mono .
Si conoce la
arquitectura de PIC16 , puede notar algunas similitudes con el bígaro (ESTADO, TAMAÑO, SINZ, REF, DEF). De hecho, me inspiró a trabajar como la primera arquitectura con la que comencé a programar en lenguaje ensamblador.