06 enero, 2012

CONJUNTO DE INSTRUCCIONES ABDLAB JENOVA VM


Éste es el conjunto de instrucciones de la máquina virtual jénova en su versión 1.07


// Comentario, éste quedará reflejado en la memoria ram, pero será ignorado en tiempo de ejecución.

multiflash Borra todos los casillerso de los 3 registros principales del núcleo.

@ Crea una etiqueta multiuso, puede ser encontrada desde cualquier parte del código, anterior o posterior sustituyendo un parámetro de cualquier instrucción por @ nombre.
uso:
@ esto_es_una_etiqueta
para saltar a esta etiqueta usando la instrucción jump (explicada más adelante)
jump @ esto_es_una_etiqueta
En tiempo de ejecución será sustituido por un número entero que representa la posición en memoria de la etiqueta indicada si existe.

proc Define la posición actual como el inicio de una macro que podrá ser llamada con la función call (expicada más adelante). El código saltará hasta la etiqueta proc y continuará ejecutandose hasta que encuentre una instrucción return, lo que hará al código volver a la siguiente posición de la llamada.
uso:
proc my_macro
para llamar a esta macro con la instrucción call:
call my_macro

pause Para la máquina virtual y la deja a la espera de una señal de bus que la haga continuar. Ten en cuenta que si usas pause no puedes volver a arrancar la máquina con el código, sólo sirve una señal a través del bus.
uso:
pause

sleep Pausa la ejecución de la máquina por el número de segundos indicado en el parámetro, que puede ser un número entero o flotante así como una referencia de memoria.
uso:
sleep 0.5

multiproc Indica a la máquina que es un momento seguro para leer las instrucciones llegadas a través del bus y ejecutar los microcódigos recibidos, principalmente de lectura o escritura de memorias. Actualiza todos los datos en el que fueron recibidos desde la última actualización. Es importante ejecutarlo cuando no estemos trabajando con los registros de la cpu ya que sus valores pueden cambiar en el proceso.
uso:
multiproc

hardstop Finaliza la ejecución de la máquina. La próxima vez que recibiera la señal de arranque a través del bus ésta volvería a resetear las memorias y empezar desde cero.

mode0 Define el modo en el que será interpretado el valor del registro0 a la hora de ser utilizado. El modo se guarda siempre en el casillero0 del registro0.


mode1 Igual que mode0 pero para el registro1.

mode2 Igual que mode0 pero para el registro2.

parse0 Divide la cadena contenida en el casillero correspondiente al puntero0 del registro0 utilizando como separador el o los carácteres indicados en el o los parámetros.
uso:
// si reg0 p1 tiene almacenado: creo que / voy a / explotar
parse reg0 /
// forzará reg0 p1 a: creo que
// reg0 p2 a: voy a
// y reg0 p3: explotar

parse1 Igual que parse0 pero para el registro1.

parse2 Igual que parse0 pero para el registro2.

join0 Une todos los casilleros del registro0 intercalando el carácter indicado en el parámetro y los almacena en el primer casillero del mismo registro, es decir reg0 p2.
join0 sobreescribe el registro0 completo.
uso:
// si en reg0 p1 tengo: hola
// y en reg0 p2: mundo
join +
// dejará en reg0 p1: hola+mundo

join1 Igual que join0 pero para el registro1.

join2 Igual que join0 pero para el registro2.


p0 Cambia el puntero que indica qué casillero del registro 0 leeremos o escribiremos a continuación. El parámetro debe de ser un número entero de 1 a 32000.
uso:
p0 5

p1 Igual que p0 pero para el registro1.

p2 Igual que p0 pero para el registro2.

mov0 Mueve el puntero del registro0 hacia arriba de su posición actual si el parámetro es + y a hacia abajo de la misma si es -. Nunca bajará por debajo del valor 1.
uso:
mov0 +

mov1 Igual que mov0 pero para el registro1.

mov2 Igual que mov0 pero para el registro2.

sector Cambia el prefijo de sector de las definiciones de la memoria de pares. Al hacer esto todos los pares almacenados aparentarán haber desaparecido pero al volver al mismo prefijo volveremos a poder trabajar con ellas.
uso:
sector test_zone_

set0 Almacena el dato indicado en el parámetro dentro del casillero indicado en p0 en el registro0.
uso:
set0 hola mundo

set1 Igual que set0 pero para el registro1.

set2 Igual que set0 pero para el registro2.

flash0 Sirve para escribir el contenido de varios casilleros del registro0 de una vez, es decir, se pueden introducir valores en reg0 p1,reg0 p2,reg0 p3, y así sucesivamente, si no se incluyen parámetros vaciará todos los casilleros.
uso:
flash0 12,13,core_reg2,test data01,testdata 02,reg0:p6 data,etc

flash1 Igual que flash0 pero para el registro1.

flash2 Igual que flash0 pero para el registro2.

busout Envía a través del bus indicado en el primer parámetro los datos indicados en el segundo y el tercero.
uso:
busout 15,test data test data,1530

input Para la máquina y se queda a la espera de que se introduzcan datos a través del canal de chat indicado en parámetro, el canal público es 0.

set Guarda en la memoria de pares el dato indicado en el segundo parámetro con el nombre o referencia indicado en el primero.
uso:
set patxi,15000

get Recupera y almacena en reg2 el valor del par con nombre o referencia igual al indicado en el parámetro.
uso:
get patxi

unset Elimina el par con nombre o referencia igual al indicado en el parámetro.
uso:
unset patxi

debug Envía los datos indicados a través del canal de debug.
uso:
debug programa terminado

jump Coloca el puntero de lectura en la posición indicada en parámetro. Se aconseja utilizar etiquetas @ para facilitar el trabajo.
uso:
jump @ label_init

jif_match Saltar a la línea indicada si el valor contenido en reg0 es identico al contenido en reg1.
uso:
jif_match @ label_init

jif Saltar a la posición indicada en el segundo parámetro si el valor del primero puede ser interpretado como SI boleano.
uso:
jif true,@ label_init

jif_max Igual que jif_match pero salta sólo si reg0 es mayor que reg1.

jif_less Igual que jif_match pero salta sólo si reg0 es menor que reg1.

call Ejecutar la macro indicada en el parámetro. La macro debe de estar definida con la etiqueta proc y cargada en la memoria ram.
uso:
call my_macro

return Indica el final de una macro, si la profundidad del proceso actual es 1 fuerza al código a reiniciarse desde el principio. Se puede añadir un parámetro opcional, jénova lo guardará en reg2 para ser consultado después.
uso:
return

suma Suma el valor contenido en reg0 al de reg1 si los dos son valores numéricos o los concatena si alguno de ellos no lo es y guarda el resultado en reg2.
uso:
mode0 int
set0 1
mode0 int
set1 3
suma
// ahora tenemos el valor 4 en reg2

resta Resta el valor contenido en reg0 al contenido en reg1, éste valor deberá ser de tipo numérico.
uso:
set0 10
set1 4
resta
// ahora tenemos el valor 6 en reg2

mult Igual que resta pero multiplicando reg0 por reg1.

div Igual que resta pero dividiendo reg0 entre reg1, además guarda el módulo o resto en los flags.

rand Genera un número aleatorio comprendido entre el número contenido en reg0 y el contenido en reg1 y lo almacena en reg2.
uso:
set0 1
set1 100
rand
// guardará un número entre 0 y 100 en el registro2.


Publicar un comentario en la entrada