Me gustaría que me diesen alguna opinión acerca de las implementaciones actuales y en el apartado 'para hacer' las ideas que tengo. La máquina virtual está programada y es rápida. Usa memoria dinámica para el uso de registros y la pila. Pronto intentaré implementar para el uso de API y añadir funcionalidades propias sin modificar código interno.
Expecificaciones del lenguaje:
Se trata de un microlenguaje de programación ensamblador orientado al uso de pila, registros y operaciones aritméticas. Esta diseñado con el mero propósito de aprender.
Dispone de 8 registros (r0-r7)(tipo entero), elegidos así porque me parece un número de registros adecuado. No admite cadenas de caracteres ni números reales. Es un lenguaje semicompilado, es decir, sus intrucciones son transmitidas a opcodes que son emulados por una máquina virtual (actualmente, la
máquina virtual ya está en una buena fase de desarrollo).
Algunas especificaciones técnicas del lenguaje:
· Debe respetarse el orden de parámetros
· Los registros son numerados desde 0 a 7, indicando que es un registro con la letra 'r' precediendo al número.
· Para definir el inicio del programa debera utilizarse la etiqueta %main% precedida de las intrucciones.
· Para definir el fin del programa debera utilizarse la etiqueta %end main%
· Para definir una funcion común (no implementado) deberá utilizarse la etiqueta %nombredefuncion,parametro1,param...% finalizando esta con %end nombredefuncion%
· Pueden incluirse comentarios en el código con ' y '= ='.
· Cada línea tendrá como máximo una función
· Pueden definirse 'cotas' de código para hacer el código más pequeño, compartiendo biblioteca que pueden ser incluidas en el código con %include archivo.mvm%. Se dispondrá de version estándar de algunas implementaciones para agilizar el uso y ampliar las funciones con el uso de API.
Función 'setr' - Establece el valor a un registro:
setr [r0-r7] num1 ' Uso normal
Función 'add' - Función con la capacidad de sumar 2 enteros y guardar la operación en el registro indicado:
add [r0-r7] num1,num2 ' Uso normal
Función 'addr' - Suma 2 enteros, uno de ellos dado por el valor de un registro. Con las funciones add y addr pueden hacerse todas las operaciones de suma desde sumar dos registros hasta sumar registro con datos de la pila:
addr [r0-r7] rX,rX ' Uso normal
Función 'neg' - Niega el valor de un registro dado:
neg [r0-r7] ' Uso normal
El equivalente a la función 'sub' se puede utilizar conjuntamente con 'addr' y 'neg':
'= Queremos restar r1 - r0 y guardar valor en r3 ='
neg r0
addr r3 r1 r0
Función 'mult' - Multiplica 2 enteros y guarda la operación en el registro dado:
mult [r0-r7] num1,num2 ' Uso normal
Función 'multr' - Multiplica el valor de 2 registros y guarda la operación en el registro dado:
multr [r0-r7] rX,rX ' Uso normal
Función 'push' - Pone el valor de un registro en pila:
push [r0-r7] ' Uso normal
Función 'pop' - Elimina el tos:
pop ' Uso normal
Función 'inrp' - Intercambia el valor de un registro y del tos:
inrp [r0-r7] ' Uso normal
El equivalente a 'inrr' (intercambiar dos registros, mov), puede hacerse con funciones ya descritas:
'= Queremos intercambiar r0 y r1. Vamos a suponer que todos los
registros tienen valores que deben ser guardados. ='
push r0
inrp r1
inrp r0
pop
Otra utilidad que tiene las funciones anteriores, no se necesita de función 'clonr' (clonar valor de un registro en otro), ya que, esta podria hacerse de muchas otras maneras con inrp o addr.
Función 'cmp' - Comparar si el valor de un registro y un valor proporcionado son iguales, mayor, menor (con respecto al registro):
cmp [r0-r7] num1 ' Uso normal
Función 'cmpr' - Comparar si el valor de dos registros son iguales, mayor, o menor (con respecto al primer registro):
cmpr [r0-r7] [r0-r7] ' Uso normal
Para hacer:
Cambiar la forma de analizar las funciones, para evitar usar funciones clonadas para operar con registros (add, addr, mult, multr...); Así, se podrá operar con los registros de una forma más fácil y comoda.
Añadir funciones condicionales, uso de cadenas, operaciones con cadenas.
Ampliar numero de funciones aritméticas (shl, shr, xor, div, mod...).