Diferencia entre revisiones de «Lenguaje eWamblador»

De Wiki~eWa
Ir a la navegaciónIr a la búsqueda
Línea 38: Línea 38:
 
La instrucción '''liberar''' se usa para liberar recursos, pero '''sin eliminar''' el alias.
 
La instrucción '''liberar''' se usa para liberar recursos, pero '''sin eliminar''' el alias.
  
  '''#liberar ''alias''
+
  '''#liberar ''alias''
 
  #liberar espacioA // esto liberará el recurso ''espacioA''
 
  #liberar espacioA // esto liberará el recurso ''espacioA''
 
  #liberar espacioB // esto liberará el recurso ''espacioB''
 
  #liberar espacioB // esto liberará el recurso ''espacioB''

Revisión del 16:30 26 may 2009

El eWamblador es el lenguaje eWa más básico de programación en la RedeWa, a excepción del escasamente abstracto lenguaje de código máquina (con las instrucciones 0, 1, 2..., C, D, E, y F), que lo convierte en el más potente si se utiliza correctamente. Se puede programar usando el Entorno de Programación Julio Verne.

Instrucciones heradadas del eWamblador

Como el eWamblador está basado en el lenguaje de código Máquina, las 16 instrucciones básicas de toda la Arquitectura eWa las herada y pueden ser usadas (y se usan para programar las mejores optimizaciones) simplemente escribiéndolas en línea:

7250B	//7250B
7210B	//1B
3250B	//3B
 654A	//64A
3654D	//3D
3614D	//2D
F	//F

En ese código se ha puesto el código completo en la columna de la izquierda, y después de los // el código optimizado. Como se podrá leer más abajo todo ese código no hace nada en especial.

El Código Máquina que se incorpora al eWamblador se considera como una función, por lo tanto, si se concatena con instrucciones extendidas, ha de separarse por ;. Esta técnica es bastante útil si se reservan registros o punteros.

Trabajo con recursos con eWamblador

En el Lenguaje eWamblador se permiten reservar varios de los recursos de un Sistema Informático. Los recursos que se pueden reservar son los registros 89ABCDEF de la CPU, los punteros de la ABU, o direcciones del Bus de Direcciones. También, permite crear alias de estas reservas.

La sintaxis usada está definida como instrucciones que empiezan por el símbolo #. Al usarse en tiempo de compilación, no es posible usar el wit (puntero actual), el wit[0] (página actual) o cualquier estructura dependiente de la ejecución.

Reservar recursos

La instrucción reservar, que se puede asemejar a la de declarar variables de los lenguajes de más alto nivel, es realmente útil no solo para crear alias de recursos, si no para verificar las colisiones de reservas: si se reserva un recurso y luego se vuelve a reservar otro sin haberlo liberado anteriormente, el eWamblador dará un aviso. Las librerías estándares suelen incorporar condicionales para revisar si estos recursos están o no reservados, tanto con ese nombre como con otro.

#reservar alias recurso
#reservar espacioA [0x01.00]0xFF // esto creará un alias llamado espacioA de
                                 // 0xFF direcciones desde la 0x1.00 del Bus
                                 // y reservará los recursos
#reservar espacioB witQ[1]  // esto creará un alias llamado espacioB de
                            // 8 direcciones del puntero Q

Liberar recursos

La instrucción liberar se usa para liberar recursos, pero sin eliminar el alias.

#liberar alias
#liberar espacioA // esto liberará el recurso espacioA
#liberar espacioB // esto liberará el recurso espacioB

Crear alias

La instrucción alias se usa para declarar alias pero sin reservar los recursos que usa. Es útil para utilizarse en entornos compartidos seguros monoprogramados en donde no es necesario andarse preocupando de la modificación de recursos o se desea compartir.

#alias alias recurso
#alias espacioA [0x01.00]0xFF // esto creará un alias llamado espacioA de
                                 // 0xFF direcciones desde la 0x1.00 del Bus
#alias espacioB witQ[]0xFF // esto creará un alias llamado espacioB de
                                 // 0xFF direcciones desde la 0x1.00 del Bus

Instrucciones propias del eWamblador

Pero como puede ser muy tedioso escribir (, repetir) e incluso entender programas escritos de esa forma, se han creado las instrucciones propias del eWamblador, que sin ser tan abstractas y simples como las del resto de lenguajes de ensamblador (con instrucciones mov, push, etc...) recuerdan un poco más a la sencillez de la Arquitectura eWa y a los programas de orientación a objetos como el C++. Estas instrucciones se llaman instrucciones extendidas.

De esta forma, el código anterior se puede escribir como:

witQ;         // selecciona el puntero Q
wit = 0;      // el puntero Q a todo 0s
wit2;         // pone a witQ2, se puede poner también conmutar la siguiente línea con esta
              // y en la propia instrucción 'witx[7] = k;' seleccionarlo así: 'wit2[7] = k;'
k = 1;        // pone k = 1
witx[7] = k;  // pone witQ2[7] = 1
witx[5] = k;  // pone witQ2[5] = 1
[wit] = k;    // pone [witQ] = 1

En ese código se ha puesto el código resumido en la columna de la izquierda, y después de los // la explicación con el código completo. Como ahora igual ya sí se puede entender, lo que hace este código es poner el puntero Q apuntando a la posición 0xA000 (1010000000000000) que, paradógicamente..., es la dirección de mapeo del controlador estándar de pantalla. Esto quiere decir, que el último [wit] = 1, escribiremos un 1 en el primer bit del controlador de la pantalla; y, un [wit+10] = 0 para escribir en el bit 11 del controlador un 0... más adelante, leyendo la información sobre la controladora de pantalla, podréis saber para qué sirve eso. De todas formas, como eWamblador no es solo un lenguaje para traducir a Código máquina con un lenguaje más amigable, si no de reducir trabajo al programador, todo el código anterior se podría resumir en:

witQ = 0xA0;  // selecciona el puntero Q y lo pone apuntando a 0xA000
[wit] = 1;    // pone en [0xA000] el valor 1

O también, sin preocuparse, por el puntero (utilizará el último usado):

[0xA0] = 1;

Pero bueno, lo primero de todo que hay que preguntarse es ¿qué es k y qué es wit? Aunque en la Arquitectura eWa se ve con más calma y dedicación podríamos decir que estas dos variables son:

K

La k es un registro real de un solo bit (o un 0 o un 1) en el que podemos tener acceso en cualquier tiempo de ejecución de un programa. Es el registro de intercambio de información entre la ABU y la MMU y está localizado en la CPU.

Acceso a los punteros

El eWamblador permite seleccionar directamente los punteros, las páginas o las componentes de los registros de la MMU.

Wit

Un wit, o puntero, es el conjunto de tantos bits (w-bits -> w-b-its -> wits) como sea el tamaño de los punteros de la MMU. Un wit generalmente se usa para dos cosas: guardar información o acceder al Bus de Direcciones.

Un wit está paginado, aunque eWamblador permite acceder sin paginación. En los SIM-E los wits tienen 8 páginas, mientras que en los SIR tienen 3 páginas. A su vez, cada página consta de 8 componentes de 1 bit cada una (un octal por página), que están numeradas de la 0 a la 7, y que siempre corresponden con los registros 01234567 de la CPU.

Resumen de las selecciones

A continuación, una tabla resumen de todas las selecciones posibles:

Selección de Punteros

TAMAÑO PUNTERO: páginas/puntero * 8 bits/página = SIM -> 64 bits/puntero | SIR -> 24 bits/puntero
wit todo el puntero actual
wit[] todo el puntero actual sin páginación

Selección de Páginas

TAMAÑO PÁGINA: 8 bits/página
wit[0] página actual del puntero actual
wit[1] página 1 del puntero actual
wit[+] página siguiente del puntero actual
wit[+2] página siguiente de la siguiente del puntero actual
wit[-2] página anterior del puntero actual

Selección de Componentes

El tamaño de una componente es de 1 bit. Hay dos formas de acceder a la componente de un puntero.

Por componentes absolutas:
wit[][0] componente absoluta 0 del puntero actual sin páginación
...
wit[][23] componente absoluta 23 del puntero actual sin páginación
Por componentes relativas a una página
wit[0][0] componente 0 de la página actual del puntero actual
...
wit[0][7] componente 7 de la página actual del puntero actual

Todas las selecciones

  • De puntero
wit;  // selecciona el puntero Actual
witQ; // selecciona puntero Q
witR; // selecciona puntero R
witS; // selecciona puntero S
witT; // selecciona puntero T
witL; // selecciona puntero L
  • De componente absoluta
wit[][0]; // selecciona la componente absoluta 0 del puntero Actual
wit[][1]; // selecciona la componente absoluta 1 del puntero Actual
...	    // 2,3,...,9,10,11,12,...,61,62
wit[][63]; // selecciona la componente absoluta 63 del puntero Actual
Valdría cambiando wit por cualquiera de los punteros disponibles.
  • De página
wit[0]; // selecciona la página actual del puntero Actual
wit[1]; // selecciona la página 1 del puntero Actual
wit[2]; // selecciona la página 2 del puntero Actual
wit[3]; // selecciona la página 3 del puntero Actual
wit[4]; // selecciona la página 4 del puntero Actual
wit[5]; // selecciona la página 5 del puntero Actual
wit[6]; // selecciona la página 6 del puntero Actual
wit[7]; // selecciona la página 7 del puntero Actual
wit[8]; // selecciona la página 8 del puntero Actual
Valdría cambiando wit por cualquiera de los punteros disponibles.
  • De componente de página
wit[0][0]; // selecciona la componente 0 de la página actual del puntero Actual
wit[0][1]; // selecciona la componente 1 de la página actual del puntero Actual
wit[0][2]; // selecciona la componente 2 de la página actual del puntero Actual
wit[0][3]; // selecciona la componente 3 de la página actual del puntero Actual
wit[0][4]; // selecciona la componente 4 de la página actual del puntero Actual
wit[0][5]; // selecciona la componente 5 de la página actual del puntero Actual
wit[0][6]; // selecciona la componente 6 de la página actual del puntero Actual
wit[0][7]; // selecciona la componente 7 de la página actual del puntero Actual
Valdría cambiando wit[0] por cualquiera de las páginas disponibles.

Las operaciones/expresiones

  • Suma de wit
wit + witS; // selecciona el valor resultante de la suma del valor del puntero Actual' más el puntero witS
wit + valor; // selecciona el valor resultante de la suma del valor del puntero Actual más el valor dado
  • Diferencia de wits
witS - witR; // selecciona el valor resultante de la resta  del valor del puntero S menos el puntero R
witS - valor; // selecciona el valor resultante de la resta del valor del puntero S menos el valor dado
  • Producto de wits
witS * witR; // selecciona el valor resultante de la multiplicación del valor del puntero S por el puntero R
witS * valor; // selecciona el valor resultante de la multiplicación del valor del puntero S por el valor dado
  • Cociente de wits
witS / wit; // selecciona el valor resultante de la resta  del valor del puntero S menos el puntero Actual
witR / valor; // selecciona el valor cociente de la división natural del valor del puntero R entre el valor dado

Las asignaciones

  • Se pueden asignar copias de punteros completos, constantes o expresiones de 64 bits
witS = wit; // copia el puntero Actual en el puntero S
wit = witR; // copia el puntero R en el puntero Actual
witS = witQ; // copia el puntero Q en el puntero S
witR = 1x20A1; // pone el puntero R apuntando a la posición hexadecimal 1...1120A1
witR = 0b1011; // pone el puntero R apuntando a la posición binaria 0...0000001011
witR =   0134; // pone el puntero R apuntando a la posición decimal 0...0000000134

(Interamente hace siempre las conversiones a binario)

wit = witS+0b110; // pone el puntero Actual a la posición 0b110 veces siguiente a la que apunta el puntero S
wit = wit+0x120; // pone el puntero Actual a la posición 0x120 veces siguiente a la Actual
wit += 2; // similar a la anterior, pone el valor Actual apuntando a la dos veces siguiente posición de memoria
wit ++; // similar a las dos anteriores, pone el valor Actual apuntando a la siguiente posición de memoria
wit = witS-0b110; // pone el puntero Actual a la posición 0b110 veces siguiente a la que apunta el puntero S
wit = wit-0x120; // pone el puntero Actual a la posición 0x120 veces anterior a la Actual
wit -= 2; // similar a la anterior, pone el valor Actual apuntando a la dos veces anterior posición de memoria
wit --; // similar a las dos anteriores, pone el valor Actual apuntando a la anterior posición de memoria

En caso de que la expresión de 64 bits sea mayor, se seleccionarán los 64 bits de menor peso, es decir, los que estarían más a la derecha (11010100 pasaría a ser, de 5 bits, 10100).

En caso de que la expresión de 64 bits sea menor, se añadirán tantos bits de mayor peso, es decir, por la izquierda (010100 pasaría a ser, de 10 bits, 0000010100) como sea necesario.

  • Se pueden asignar copias de páginas de punteros, constantes o expresiones 8 bits
wit
  • Se pueden asignar copias de componentes de punteros, constantes o expresiones 1 bits
witx[]
  • Se pueden asignar copias de componentes absolutas de punteros, constantes o expresiones 1 bit
wit[32] = 1; // pone la componente absoluta 32 del puntero Actual a 1;
wit[21] = witS[1]; // pone la componente absoluta 21 del puntero Actual al valor de la componente absuluta 1 de la
wit[21] = witS1[1]; // pone la componente absoluta 21 del puntero Actual al valor de la componente 1 de la página 1 del puntero S
witR[1] = 1-wit[1];

Acceso al Bus de Direcciones

Véase también: Bus de Direcciones

  • Se pueden asignar a constantes o expresiones de 1 bit o más (acotado).
[wit] = 1; // en la dirección que apunta el puntero Actual, pondrá un 1
[wit] = 100; // a partir de la dirección que apunta el puntero Actual, pondrá un 100 (0b1100100) que ocupará 7 bits.
[wit]4 = 101; // a partir de la dirección que apunta el puntero Actual, pondrá un 101 (0b1100101) acotado en 4 bits, es decir,
solo 0b0101 (que es en decimal 5).
[wit]6 = 0x1; // a partir de la dirección que apunta el puntero Actual, pondrá un 0x1(0b1) acotado en 6 bits, es decir,
solo 0b000001 (que es en decimal 1).
[wit]10 = 1b001; // a partir de la dirección que apunta el puntero Actual, pondrá un 1b001 acotado en 10 bits, es decir, solo
0b1111111001 (que es en decimal 1017).

Nótese que si es un relleno de 'todo unos hasta' (1b o 1x) es necesario indicar la cota;
si no se indica, se tomará como un relleno de 'todo ceros hasta' y se aplicará la norma
de mínimo relleno.