Diferencia entre revisiones de «Lenguaje eWamblador»

De Wiki~eWa
Ir a la navegaciónIr a la búsqueda
 
(No se muestran 106 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
El '''eWamblador''' es el [[LeWaS|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]].
+
[[Archivo:Logo ewamblador.PNG|thumb|500px|Logo del '''eWamblador'''.]]El '''eWamblador''' es el [[LeWaS|Lenguaje de programación eWa]] más básico para desarrollar [[Soluciones Informáticas]] del [[Proyecto eWa]]. Genera resultados en [[código máquina]] (instrucciones '''0, 1, 2..., C, D, E, y F'''). Está basado directamente en las [[Instrucciones del Compilador de Idioma eWa]] y su evolución es el [[Lenguaje eWa]].
  
== Instrucciones heradadas del eWamblador ==
+
Como todos los [[LeWaS]], usa el [[Idioma eWa]]. Es el más eficiente si se utiliza correctamente. Se puede programar en el '''Lenguaje eWamblador''' usando el [[entorno de programación]] [[Julio Verne]].
  
Como el eWamblador está basado en el lenguaje de [[código Máquina]], las 16 [[Código Máquina|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:
+
'''''Pincha [[EWAMBLADOR.lws|aquí]] para ver la cabecera del Lenguaje eWamblador'''''
  
7250B //7250B
+
== Instrucciones heredadas en eWamblador ==
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.
+
Como el '''eWamblador''' está basado en el lenguaje de [[código Máquina]], hereda las 16 [[Código Máquina|instrucciones básicas]] de toda la [[Arquitectura eWa]]. Pueden ser usadas (y se usan para programar los objetos primitivos y optimizaciones) simplemente escribiéndolas tras la instrucción '''''#compila''''':
 +
 
 +
#compila 7250B; // 7250B -> 7250B
 +
#compila 7210B; //  1 B -> 1B
 +
#compila 3250B; // 3 5 B -> 35B
 +
#compila  654A; //  6 4A -> 64A
 +
#compila 3654D; // 3  D -> 3D
 +
#compila 3614D; //  1 D -> 1D
 +
#compila    F; //    F -> F
 +
 
 +
En esa bloque de [[Instrucciones Básicas]] se ha puesto el código completo en la columna de la izquierda, y después de los '''//''' el código optimizado. La optimización básica de [[Código Máquina]] se realiza eliminando los valores de las columnas numerales cuando en la fila anterior se repite.
  
 
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.
 
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.
  
== Reservar recursos con eWamblador ==
+
== Trabajo con recursos con eWamblador ==
 +
{{AP|Instrucciones del Compilador de Idioma eWa}}
 +
Gracias a las [[Instrucciones del Compilador de Idioma eWa]], 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'''/registros de la [[ABU]], o direcciones o bloques del [[Espacio de Direcciones]]. También, permite crear '''alias''' de estas reservas y varias cosas más.
  
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 de las [[Instrucciones del Compilador de Idioma eWa]] se define como '''expresiones que empiezan por el símbolo ''#'''''. Al usarse en tiempo de compilación, no es posible usar el '''wit''' ('''puntero actual'''), el '''wit[]''' ('''página actual''') o cualquier estructura dependiente de la ejecución. En este caso lo que se referenciará será '''un recurso similar a ese''', por ejemplo, el uso de '''wit''' reservará un puntero que no esté reservado.
 +
 
 +
=== Reservar recursos ===
 +
 
 +
La expresió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.
  
La sintaxis usada está definida como instrucciones que empiezan por el símbolo '''#':
 
 
  '''#reservar ''alias'' recurso'''
 
  '''#reservar ''alias'' recurso'''
  #reservar espacioA [0x01.00]0xFF // esto creará un alias llamado ''espacioA'' de
+
  #reservar espacioA bus[0x01.00]0xFF // esto creará un alias llamado ''espacioA'' que reservará
                                  // 0xFF direcciones desde la 0x1.00 del [[Bus de Direcciones|Bus]]
+
                                    // 0xFF direcciones desde la 0x1.00 del [[Espacio de Direcciones|Bus]]
  #reservar espacioB witQ[]0xFF // esto creará un alias llamado ''espacioB'' de
+
  #reservar espacioB bus[]0xFF   // esto creará un alias llamado ''espacioB'' que reservará
                                  // 0xFF direcciones desde la 0x1.00 del [[Bus de Direcciones|Bus]]
+
                                // 0xFF direcciones (bits) desde un sitio libre
 +
 +
#reservar espacioC witQ[1]  // esto creará un alias llamado ''espacioC'' que reservará
 +
                            // los 8 bits de la página 1 del puntero Q
 +
 
 +
=== Liberar recursos ===
 +
 
 +
La expresió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 expresión '''alias''' se usa para declarar alias pero sin reservar los recursos que usa. Es útil para utilizarse en entornos compartidos seguros mono-programados en donde no es necesario andarse preocupando de la modificación de recursos o se desea compartir. Por ejemplo es muy útil para crear alias de los [[CUW]]s o posiciones concretas del [[Sistema Informático]].
  
La técnica de 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
+
'''#alias'' alias'' recurso'''
 +
#alias espacioA [0x01.00]0xFF // esto creará un alias llamado ''espacioA'' de
 +
                              // 0xFF direcciones desde la 0x1.00 del [[Espacio de Direcciones|Bus]]
 +
 +
#alias espacioB witQ[]0xFF // esto creará un alias llamado ''espacioB'' de
 +
                            // 0xFF direcciones desde la 0x1.00 del [[Espacio de Direcciones|Bus]]
  
 
== Instrucciones propias del eWamblador ==  
 
== Instrucciones propias del eWamblador ==  
Línea 43: Línea 72:
 
  witx[7] = k;  // pone witQ2[7] = 1
 
  witx[7] = k;  // pone witQ2[7] = 1
 
  witx[5] = k;  // pone witQ2[5] = 1
 
  witx[5] = k;  // pone witQ2[5] = 1
  [wit] = k;   // pone [witQ] = 1
+
  bus[wit] = k; // pone bus[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''.
 
''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 0x'''A0'''00 ('''10100000'''00000000) 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:
+
Como ahora igual ya sí se puede entender, lo que hace este código es poner el '''puntero Q''' apuntando a la posición 0x'''A0'''00 ('''10100000'''00000000) que, paradógicamente..., es la dirección de mapeo del [[pantalla|gestor 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
 
  witQ = 0xA0;  // selecciona el puntero Q y lo pone apuntando a 0xA000
  [wit] = 1;    // pone en [0xA000] el valor 1
+
  bus[wit] = 1;    // pone en [0xA000] el valor 1
  
 
O también, sin preocuparse, por el puntero (utilizará el último usado):
 
O también, sin preocuparse, por el puntero (utilizará el último usado):
  
  [0xA0] = 1;
+
  bus[0xA0] = 1;
 +
 
 +
== Objetos e Instancias del Lenguaje eWamblador ==
 +
 
 +
El '''Lenguaje eWamblador''' se podría considerar un '''lenguaje orientado a objetos e instancias'''. Básicamente, lo que se intenta en el '''eWamblador''' es crear un pequeño conjunto de instancias con operaciones declaradas en el propio lenguaje.
 +
 
 +
=== Objetos primitivos ===
 +
 
 +
Todas estas instancias tienen definidas operaciones de acceso a subconjuntos, hasta como siempre, llegar a una instancia de [[Objetos:BIT|objeto BIT]]:
 +
 
 +
==== REG ====
 +
{{AP|Objeto:REG}}
 +
La instancia '''reg''' es un [[Objeto:REG|objeto REG]] que utiliza el operador '''REG[valor:char5="K"]''' (reg["A"] por ejemplo) que espera un valor de 5 bits que se interpretará como un '''char5''' o tomará el valor por defecto ''"K"'' y devuelve el selector '''BIT''' o '''WIT''' de un registro del núcleo.
 +
 
 +
En realidad es un pseudo-[[objeto]], ya que en realidad se define con '''#define''' ya que no es posible invocar a una [[función]] que modifique los registros del núcleo de un [[Sistema Informático]] sin ya de por sí modificarlos.
 +
 
 +
==== WIT ====
 +
{{AP|Objeto:WIT}}
 +
La instancia '''wit''' es un [[Objeto:WIT|objeto WIT]] que utiliza tres operadores: dos de selección y uno de asignación. Los dos de selección son el operador '''WIT[pag:uint4=null]''' (wit[2] por ejemplo) que espera una página de 4 bits que se interpretará como un uint4 o tomará el valor por defecto ''null'' y devuelve el selector '''PAG''' de la página seleccionada del puntero de la [[MMU]]; y el operador '''WIT<nowiki>[[comp_abs:uint6]]</nowiki>''' (wit<nowiki>[[12]]</nowiki> por ejemplo) que espera una componente absoluta de 4 bits que se interpretará como un uint6 y devuelve el selector '''BIT''' de la componente absoluta seleccionada del puntero de la [[MMU]]. El operador de asignación es '''WIT = valor:uint64''' (wit = 0x542 por ejemplo) que espera un valor de 64 bits que se interpretará como un uint64, se lo asigna a ese WIT, y lo devuelve.
 +
 
 +
==== BUS ====
 +
{{AP|Objeto:BUS}}
 +
La instancia '''bus''' es un [[Objeto:BUS|objeto BUS]] que utiliza el operador '''BUS[pos:uint64]tam:uint=null''' (bus[0x542] por ejemplo), que espera una posición de 64 bits que se interpretará como un uint64 y un tamaño que por defecto será el mínimo posible compatible mayor que cero, y devuelve el selector a un registro o conjunto de registros del [[Espacio de Direcciones]].
  
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:
+
=== Otros objetos primitivos ===
  
=== K ===
+
Además, debido a '''selectores''' de los [[objetos]] anteriores, el '''Lenguaje eWamblador''' define varios '''objetos primitivos''' más:
  
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]].
+
==== PAG ====
 +
{{AP|Objeto:PAG}}
 +
Un [[Objeto:PAG|objeto PAG]] es un [[objeto]] que implementa dos operadores: uno de selección y otro de asignación. El de selección es el operador '''PAG[comp:uint3]''' ( (witQ[2])[5] por ejemplo) que espera una componente relativa que se interpretará como un uint3, y devuelve el selector BIT de la componente relativa a la página seleccionada. El operador de asignación es '''PAG = valor:uint8''' (witQ[2] = 0b1000.1110 por ejemplo) que espera un valor de 8 bits que se interpretará como un uint8, se lo asigna a ese PAG, y lo devuelve.
 +
 
 +
==== BIT ====
 +
{{AP|Objeto:BIT}}
 +
Un [[Objeto:BIT|objeto BIT]] es un [[objeto]] que implementa un solo operador, el de asignación. El de asignación es el operador '''BIT = valor:uint1''' (reg[] = 1 por ejemplo) que espera un valor de 1 bit que se interpretará como un uint1, se lo asigna a ese BIT, y lo devuelve.
 +
 
 +
=== Instancias ===
 +
 
 +
Las instancias que se crean en el '''Lenguaje eWamblador''' son tres, y corresponden a cada uno de los tres '''Objetos primitivos''' que implementa.
 +
 
 +
* '''reg''':[[Objeto:REG|REG]]. Contiene el conjunto de todos '''registros del núcleo'''.
 +
* '''wit''':[[Objeto:WIT|WIT]]. Contiene el conjunto de '''páginas de punteros de la [[MMU]]'''.
 +
* '''bus''':[[Objeto:BUS|BUS]]. Contiene el conjunto de '''bits del [[Espacio de Direcciones]]'''.
 +
 
 +
''En el caso de los '''wit''', en realidad, se genera una instancia distinta para cada puntero de la [[MMU]]; que realmente son alias de selectores de la instancia '''reg'''.''
  
 
== Acceso a los punteros ==
 
== Acceso a los punteros ==
  
El '''eWamblador''' permite seleccionar directamente los punteros, las páginas o las componentes de los '''registros''' de la [[MMU]].
+
El '''eWamblador''' permite seleccionar directamente '''los punteros''', '''las páginas''' o '''las componentes''' de los '''registros''' de la [[MMU]] en tiempo de compilación. Eso es posible gracias a los pseudo-[[objetos]] citados anteriormente.
  
 
=== Wit ===
 
=== Wit ===
  
Significa '''puntero''' y, aunque apunta siempre a un puntero real parcial o completo, se suele conocer más bien como un puntero virtual de tantos bits (w-bits -> w-b-its -> wits) como sea el tamaño de los [[punteros]] de la [[MMU]], ya que ese es el tamaño de todos los punteros. Para el eWamblador es la parte más básica y su división se realiza en [[wits de página|páginas]] de 8 bits (1 octal) cada una, o en (para [[MMU]]s de [[espacio de direcciones]] de 64 bits, las más usadas) 64 [[wits de  componente absoluta|componentes absolutas]] numeradas de la 0 a la 63. A su vez, cada página se divide en 8 [[wits de  componente relativa|componentes ''relativas'']] numeradas de la 0 a la 7, que siempre corresponden con los '''registros 01234567''' de la [[CPU]].
+
Un '''wit''', o '''puntero''', es el conjunto de tantos bits (ewa-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 [[Espacio de Direcciones]].
  
Aunque esos registros son reales, normalmente el '''eWamblador''' utiliza unos punteros virtuales para agilizar el proceso de ejecución y las optimizaciones; es por eso por lo que los punteros, los ''wits'', se entienden como virtuales.
+
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''') en todos los [[Sistemas Informáticos]], que están numeradas de la '''0''' a la '''7''', y que siempre corresponden con los '''registros 01234567''' de la [[CPU]].
  
=== Las selecciones ===
+
=== Resumen de las selecciones ===
  
 
A continuación, una tabla resumen de todas las selecciones posibles:
 
A continuación, una tabla resumen de todas las selecciones posibles:
  
TAMAÑO PUNTERO: páginas/puntero * 8 bits/página = SIM -> 64 bits/puntero | SIR -> 24 bits/puntero
+
==== Selección de Punteros ====
'''wit''' todo el '''puntero actual'''
+
 
'''wit'''[] todo el '''puntero actual'''sin páginación
+
Tamaño de una instancia '''WIT''': páginas/puntero * 8 bits/página => SIM 64 bits/puntero | SIR 24 bits/puntero
+
 
TAMAÑO PÁGINA: 8 bits/página
+
{| border="2" style="padding: 0.5em; border: 1px #aaa solid; border-collapse: collapse;background:#F9F9F9" cellpadding="4" align="center"
'''wit'''[0] página actual del '''puntero actual'''
+
|- bgcolor="#aaffcc"
'''wit'''[1] página 1 del '''puntero actual'''
+
! Comando || align="left" | Selecciona...
'''wit'''[+] página siguiente del '''puntero actual'''
+
|-
  '''wit'''[+2] página siguiente de la siguiente del '''puntero actual'''
+
| align="center" | '''wit''' || todo el '''puntero actual'''
  '''wit'''[-2] página anterior del '''puntero actual'''
+
|-
+
| align="center" | '''witQ''' || todo el '''puntero Q'''
TAMAÑO COMPONENTE: 1 bit/componente
+
|-
  '''wit'''[][0] componente absoluta 0 del '''puntero actual''' sin páginación
+
| align="center" | '''witR''' || todo el '''puntero R'''
...
+
|-
  '''wit'''[][23] componente absoluta 23 del '''puntero actual''' sin páginación
+
| align="center" | '''witS''' || todo el '''puntero S'''
  '''wit'''[0][0] componente 0 de la página actual del '''puntero actual'''
+
|-
...
+
| align="center" | '''witT''' || todo el '''puntero T'''
  '''wit'''[0][7] componente 7 de la página actual del '''puntero actual'''
+
|-
  '''wit'''[1][0] componente 0 de la página 1 del '''puntero actual'''
+
| align="center" | '''witL''' || todo el '''puntero L'''
  ...
+
|}
  '''wit'''[1][7] componente 7 de la página 1 del '''puntero actual'''
+
 
 +
==== Selección de Páginas ====
 +
 
 +
Tamaño de una instancia '''PAG''': 8 bits/página
 +
 
 +
{| border="2" style="padding: 0.5em; border: 1px #aaa solid; border-collapse: collapse;background:#F9F9F9" cellpadding="4" align="center"
 +
|- bgcolor="#aaffcc"
 +
! Comando || align="left" | Selecciona...
 +
|-
 +
| align="center" | '''wit'''[]   || página actual del '''puntero actual'''
 +
|-
 +
| align="center" | '''wit'''[+] || página siguiente del '''puntero actual'''
 +
|-
 +
| align="center" | '''wit'''[+2] || página siguiente de la siguiente del '''puntero actual'''
 +
|-
 +
| align="center" | '''wit'''[-] || página anterior del '''puntero actual'''
 +
|- bgcolor="#aaffcc"
 +
! Comando || align="left" | Selecciona...
 +
|-
 +
| align="center" | '''wit'''[0] || página 0 del '''puntero actual'''
 +
|-
 +
| align="center" | '''wit'''[1] || página 1 del '''puntero actual'''
 +
|- bgcolor="#ffffff"
 +
| align="center" | ... || align="center" | ...
 +
|-
 +
| align="center" | '''wit'''[7] || página 7 del '''puntero actual'''
 +
|}
 +
 
 +
==== Selección de Componentes ====
 +
 
 +
Tamaño de una instancia '''BIT''' '''1 bit'''. Hay dos formas de acceder a la componente de un puntero.
  
La palabra '''wit''' se puede modificar por uno de los siguientes punteros relativos:
+
Por componentes absolutas:
 +
{| border="2" style="padding: 0.5em; border: 1px #aaa solid; border-collapse: collapse;background:#F9F9F9" cellpadding="4" align="center"
 +
|- bgcolor="#aaffcc"
 +
! Comando || align="left" | Selecciona...
 +
|-
 +
|  align="center" | '''wit'''<nowiki>[[0]]</nowiki> || componente '''absoluta''' 0 del '''puntero actual'''
 +
|-
 +
|  align="center" | '''wit'''<nowiki>[[1]]</nowiki> || componente '''absoluta''' 1 del '''puntero actual'''
 +
|- bgcolor="#ffffff"
 +
|  align="center" | ...  || align="center" | ...
 +
|-
 +
|  align="center" | '''wit'''<nowiki>[[63]]</nowiki> || componente '''absoluta''' 63 del '''puntero actual'''
 +
|}
  
* De puntero
+
Por componentes relativas a una página:
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
+
{| border="2" style="padding: 0.5em; border: 1px #aaa solid; border-collapse: collapse;background:#F9F9F9" cellpadding="4" align="center"
  ''wit''[][0]; // selecciona la componente absoluta 0 del puntero '''Actual'''
+
|- bgcolor="#aaffcc"
  ''wit''[][1]; // selecciona la componente absoluta 1 del puntero '''Actual'''
+
! Comando || align="left" | Selecciona...
  ...     // 2,3,...,9,10,11,12,...,61,62
+
|-
  ''wit''[][63]; // selecciona la componente absoluta 63 del puntero '''Actual'''
+
| align="center" | '''wit[0]'''[0] || componente 0 de '''la página actual del puntero actual'''
Valdría cambiando '''wit''' por cualquiera de los punteros disponibles.
+
|-
 +
| align="center" | '''wit[0]'''[1] || componente 1 de '''la página actual del puntero actual'''
 +
|- bgcolor="#ffffff"
 +
| align="center" | ... || align="center" | ...
 +
|-
 +
| align="center" | '''wit[0]'''[7] || componente 7 de '''la página actual del puntero actual'''
 +
|}
  
* 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 ===
 
=== Las operaciones/expresiones ===
  
 
* Suma de wit
 
* Suma de wit
  ''wit'' + ''witS''; // selecciona el valor resultante de la suma del valor del puntero ''Actual''' más el puntero '''witS'''
+
  ''wit'' + ''witS''; // selecciona el valor resultante de la suma del valor del
  ''wit'' + '''valor'''; // selecciona el valor resultante de la suma del valor del puntero ''Actual'' más el valor dado
+
                    // 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
 
* Diferencia de wits
  ''witS'' - ''witR''; // selecciona el valor resultante de la resta del valor del '''puntero S''' menos el '''puntero R'''
+
  ''witS'' - ''witR''; // selecciona el valor resultante de la resta del valor  
''witS'' - '''valor'''; // selecciona el valor resultante de la resta del valor del '''puntero S''' menos el valor dado
+
                      // del '''puntero S''' menos el '''puntero R'''
 
+
  ''witS'' - '''valor'''; // selecciona el valor resultante de la resta del valor
* Producto de wits
+
                        // del '''puntero S''' menos el valor dado
''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 ===
 
=== Las asignaciones ===
  
 
* Se pueden asignar copias de punteros completos, constantes o expresiones de 64 bits
 
* Se pueden asignar copias de punteros completos, constantes o expresiones de 64 bits
  witS = wit; // copia el puntero Actual en el '''puntero S'''
+
  witS = wit; // copia el puntero Actual en el '''puntero S'''
  wit = witR; // copia el '''puntero R''' en el puntero Actual
+
  wit = witR; // copia el '''puntero R''' en el puntero Actual
 
  witS = witQ; // copia el '''puntero Q''' en el '''puntero S'''
 
  witS = witQ; // copia el '''puntero Q''' en el '''puntero S'''
 
 
Línea 165: Línea 249:
 
  witR = 0b1011; // pone el '''puntero R''' apuntando a la posición binaria 0...0000001011
 
  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
 
  witR =  0134; // pone el '''puntero R''' apuntando a la posición decimal 0...0000000134
(Interamente hace siempre las conversiones a binario)
+
(Internamente 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 = 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 = 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 += 2; // similar a la anterior, pone el valor Actual apuntando a la dos veces
  wit ++; // similar a las dos anteriores, pone el valor Actual apuntando a la siguiente posición de memoria
+
          // 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 = 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 = 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 -= 2; // similar a la anterior, pone el valor Actual apuntando a la dos
  wit --; // similar a las dos anteriores, pone el valor Actual apuntando a la anterior posición de memoria
+
          // 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 (110'''10100''' pasaría a ser, de 5 bits, 10100).
 
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 (110'''10100''' pasaría a ser, de 5 bits, 10100).
Línea 188: Línea 278:
  
 
* Se pueden asignar copias de componentes absolutas de punteros, constantes o expresiones 1 bit
 
* 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<nowiki>[[32]]</nowiki> = 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<nowiki>[[21]]</nowiki> = witS[1]; // pone la componente absoluta 21 del puntero Actual
  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
+
                      // al valor de la componente absoluta 1 de la
  witR[1] = 1-wit[1];
+
  wit<nowiki>[[21]]</nowiki> = 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] = 1-wit<nowiki>[[1]]</nowiki>; // pone la componente 1 de la página 1 del puntero R
 +
                          // el valor negado de la componente absoluta 1 del puntero actual
  
== Acceso al Bus de Direcciones ==
+
== Acceso al Espacio de Direcciones ==
{{VT|Bus de Direcciones}}
+
{{VT|Espacio de Direcciones}}
 +
El acceso al [[Espacio de Direcciones]] del '''Lenguaje eWamblador''' se realiza gracias a la instancia '''bus''':[[Objetos:BUS|BUS]] enviándole un '''puntero''':[[Objetos:WIT|WIT]] bajo el '''operador[]'''. El resultado de esa llamada devuelve la referencia a un '''bit''':[[Objetos:BIT|BIT]] que puede ser tomado o escrito.
  
 
* Se pueden asignar a constantes o expresiones de 1 bit o más (acotado).
 
* 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
+
  bus['''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 (0b110'''0100''') que ocupará 7 bits.
+
  bus['''wit'''] = witQ<nowiki>[[26]]</nowiki>; // en la dirección que apunta el puntero Actual,
  ['''wit''']4 = 101; // a partir de la dirección que apunta el puntero Actual, pondrá un 101 (0b110'''0101''') acotado en 4 bits, es decir,
+
                        // pondrá la componente absoluta seleccionada
solo 0b'''0101''' (que es en decimal 5).
+
witQ<nowiki>[[26]]</nowiki> = bus['''wit''']; // en la componente absoluta seleccionada, pondrá
  ['''wit''']6 = 0x1; // a partir de la dirección que apunta el puntero Actual, pondrá un 0x1(0b1) acotado en 6 bits, es decir,
+
                        // la dirección que apunta el puntero Actual
solo 0b'''000001''' (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
+
bus['''wit'''] = 100; // a partir de la dirección que apunta el puntero Actual, pondrá
0b'''1111111001''' (que es en decimal 1017).
+
                // un 100 decimal (0b110'''0100''') que ocupará 7 bits.
 +
  bus['''wit''']4 = 101; // a partir de la dirección que apunta el puntero Actual, pondrá
 +
                  // un 101 decimal (0b110'''0101''') acotado en 4 bits, es decir,
 +
                  // solo 0b'''0101''' (que es en decimal 5).
 +
  bus['''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 0b'''000001'''
 +
                  // (que es en decimal 1).
 +
  bus['''wit''']10 = 1b001; // a partir de la dirección que apunta el puntero Actual, pondrá
 +
                    // un 1b001 acotado en 10 bits, es decir, solo 0b'''1111111001'''
 +
                    // (que es en decimal 1017).
 
   
 
   
  Nótese que si es un relleno de 'todo unos hasta' (1b o 1x) es necesario indicar la cota;
+
  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]].
si no se indica, se tomará como un relleno de 'todo ceros hasta' y se aplicará la norma
 
de [[mínimo relleno]].
 
  
[[Categoría:LeWaS]]
+
[[Categoría: LeWaS]]
 +
[[Categoría:Lenguaje]]
 +
[[Categoría: Idioma]]
 +
[[Categoría: Solución Informática]]
 +
[[Categoría: Solución]]

Revisión actual del 14:42 12 abr 2012

Logo del eWamblador.

El eWamblador es el Lenguaje de programación eWa más básico para desarrollar Soluciones Informáticas del Proyecto eWa. Genera resultados en código máquina (instrucciones 0, 1, 2..., C, D, E, y F). Está basado directamente en las Instrucciones del Compilador de Idioma eWa y su evolución es el Lenguaje eWa.

Como todos los LeWaS, usa el Idioma eWa. Es el más eficiente si se utiliza correctamente. Se puede programar en el Lenguaje eWamblador usando el entorno de programación Julio Verne.

Pincha aquí para ver la cabecera del Lenguaje eWamblador

Instrucciones heredadas en eWamblador

Como el eWamblador está basado en el lenguaje de código Máquina, hereda las 16 instrucciones básicas de toda la Arquitectura eWa. Pueden ser usadas (y se usan para programar los objetos primitivos y optimizaciones) simplemente escribiéndolas tras la instrucción #compila:

#compila 7250B;	// 7250B -> 7250B
#compila 7210B;	//   1 B -> 1B
#compila 3250B;	// 3 5 B -> 35B
#compila  654A;	//  6 4A -> 64A
#compila 3654D;	// 3   D -> 3D
#compila 3614D;	//   1 D -> 1D
#compila     F;	//     F -> F

En esa bloque de Instrucciones Básicas se ha puesto el código completo en la columna de la izquierda, y después de los // el código optimizado. La optimización básica de Código Máquina se realiza eliminando los valores de las columnas numerales cuando en la fila anterior se repite.

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

Gracias a las Instrucciones del Compilador de Idioma eWa, 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/registros de la ABU, o direcciones o bloques del Espacio de Direcciones. También, permite crear alias de estas reservas y varias cosas más.

La sintaxis de las Instrucciones del Compilador de Idioma eWa se define como expresiones que empiezan por el símbolo #. Al usarse en tiempo de compilación, no es posible usar el wit (puntero actual), el wit[] (página actual) o cualquier estructura dependiente de la ejecución. En este caso lo que se referenciará será un recurso similar a ese, por ejemplo, el uso de wit reservará un puntero que no esté reservado.

Reservar recursos

La expresió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 bus[0x01.00]0xFF // esto creará un alias llamado espacioA que reservará
                                    // 0xFF direcciones desde la 0x1.00 del Bus
#reservar espacioB bus[]0xFF   // esto creará un alias llamado espacioB que reservará
                               // 0xFF direcciones (bits) desde un sitio libre

#reservar espacioC witQ[1]  // esto creará un alias llamado espacioC que reservará
                            // los 8 bits de la página 1 del puntero Q

Liberar recursos

La expresió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 expresión alias se usa para declarar alias pero sin reservar los recursos que usa. Es útil para utilizarse en entornos compartidos seguros mono-programados en donde no es necesario andarse preocupando de la modificación de recursos o se desea compartir. Por ejemplo es muy útil para crear alias de los CUWs o posiciones concretas del Sistema Informático.

#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
bus[wit] = k; // pone bus[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 gestor 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
bus[wit] = 1;    // pone en [0xA000] el valor 1

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

bus[0xA0] = 1;

Objetos e Instancias del Lenguaje eWamblador

El Lenguaje eWamblador se podría considerar un lenguaje orientado a objetos e instancias. Básicamente, lo que se intenta en el eWamblador es crear un pequeño conjunto de instancias con operaciones declaradas en el propio lenguaje.

Objetos primitivos

Todas estas instancias tienen definidas operaciones de acceso a subconjuntos, hasta como siempre, llegar a una instancia de objeto BIT:

REG

Artículo principal: Objeto:REG

La instancia reg es un objeto REG que utiliza el operador REG[valor:char5="K"] (reg["A"] por ejemplo) que espera un valor de 5 bits que se interpretará como un char5 o tomará el valor por defecto "K" y devuelve el selector BIT o WIT de un registro del núcleo.

En realidad es un pseudo-objeto, ya que en realidad se define con #define ya que no es posible invocar a una función que modifique los registros del núcleo de un Sistema Informático sin ya de por sí modificarlos.

WIT

Artículo principal: Objeto:WIT

La instancia wit es un objeto WIT que utiliza tres operadores: dos de selección y uno de asignación. Los dos de selección son el operador WIT[pag:uint4=null] (wit[2] por ejemplo) que espera una página de 4 bits que se interpretará como un uint4 o tomará el valor por defecto null y devuelve el selector PAG de la página seleccionada del puntero de la MMU; y el operador WIT[[comp_abs:uint6]] (wit[[12]] por ejemplo) que espera una componente absoluta de 4 bits que se interpretará como un uint6 y devuelve el selector BIT de la componente absoluta seleccionada del puntero de la MMU. El operador de asignación es WIT = valor:uint64 (wit = 0x542 por ejemplo) que espera un valor de 64 bits que se interpretará como un uint64, se lo asigna a ese WIT, y lo devuelve.

BUS

Artículo principal: Objeto:BUS

La instancia bus es un objeto BUS que utiliza el operador BUS[pos:uint64]tam:uint=null (bus[0x542] por ejemplo), que espera una posición de 64 bits que se interpretará como un uint64 y un tamaño que por defecto será el mínimo posible compatible mayor que cero, y devuelve el selector a un registro o conjunto de registros del Espacio de Direcciones.

Otros objetos primitivos

Además, debido a selectores de los objetos anteriores, el Lenguaje eWamblador define varios objetos primitivos más:

PAG

Artículo principal: Objeto:PAG

Un objeto PAG es un objeto que implementa dos operadores: uno de selección y otro de asignación. El de selección es el operador PAG[comp:uint3] ( (witQ[2])[5] por ejemplo) que espera una componente relativa que se interpretará como un uint3, y devuelve el selector BIT de la componente relativa a la página seleccionada. El operador de asignación es PAG = valor:uint8 (witQ[2] = 0b1000.1110 por ejemplo) que espera un valor de 8 bits que se interpretará como un uint8, se lo asigna a ese PAG, y lo devuelve.

BIT

Artículo principal: Objeto:BIT

Un objeto BIT es un objeto que implementa un solo operador, el de asignación. El de asignación es el operador BIT = valor:uint1 (reg[] = 1 por ejemplo) que espera un valor de 1 bit que se interpretará como un uint1, se lo asigna a ese BIT, y lo devuelve.

Instancias

Las instancias que se crean en el Lenguaje eWamblador son tres, y corresponden a cada uno de los tres Objetos primitivos que implementa.

  • reg:REG. Contiene el conjunto de todos registros del núcleo.
  • wit:WIT. Contiene el conjunto de páginas de punteros de la MMU.
  • bus:BUS. Contiene el conjunto de bits del Espacio de Direcciones.

En el caso de los wit, en realidad, se genera una instancia distinta para cada puntero de la MMU; que realmente son alias de selectores de la instancia reg.

Acceso a los punteros

El eWamblador permite seleccionar directamente los punteros, las páginas o las componentes de los registros de la MMU en tiempo de compilación. Eso es posible gracias a los pseudo-objetos citados anteriormente.

Wit

Un wit, o puntero, es el conjunto de tantos bits (ewa-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 Espacio 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) en todos los Sistemas Informáticos, 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 de una instancia WIT: páginas/puntero * 8 bits/página => SIM → 64 bits/puntero | SIR → 24 bits/puntero

Comando Selecciona...
wit todo el puntero actual
witQ todo el puntero Q
witR todo el puntero R
witS todo el puntero S
witT todo el puntero T
witL todo el puntero L

Selección de Páginas

Tamaño de una instancia PAG: 8 bits/página

Comando Selecciona...
wit[] página actual del puntero actual
wit[+] página siguiente del puntero actual
wit[+2] página siguiente de la siguiente del puntero actual
wit[-] página anterior del puntero actual
Comando Selecciona...
wit[0] página 0 del puntero actual
wit[1] página 1 del puntero actual
... ...
wit[7] página 7 del puntero actual

Selección de Componentes

Tamaño de una instancia BIT 1 bit. Hay dos formas de acceder a la componente de un puntero.

Por componentes absolutas:

Comando Selecciona...
wit[[0]] componente absoluta 0 del puntero actual
wit[[1]] componente absoluta 1 del puntero actual
... ...
wit[[63]] componente absoluta 63 del puntero actual

Por componentes relativas a una página:

Comando Selecciona...
wit[0][0] componente 0 de la página actual del puntero actual
wit[0][1] componente 1 de la página actual del puntero actual
... ...
wit[0][7] componente 7 de la página actual del puntero actual


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

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

(Internamente 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 absoluta 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] = 1-wit[[1]]; // pone la componente 1 de la página 1 del puntero R
                         // el valor negado de la componente absoluta 1 del puntero actual

Acceso al Espacio de Direcciones

Véase también: Espacio de Direcciones

El acceso al Espacio de Direcciones del Lenguaje eWamblador se realiza gracias a la instancia bus:BUS enviándole un puntero:WIT bajo el operador[]. El resultado de esa llamada devuelve la referencia a un bit:BIT que puede ser tomado o escrito.

  • Se pueden asignar a constantes o expresiones de 1 bit o más (acotado).
bus[wit] = 1; // en la dirección que apunta el puntero Actual, pondrá un 1
bus[wit] = witQ[[26]]; // en la dirección que apunta el puntero Actual,
                       // pondrá la componente absoluta seleccionada
witQ[[26]] = bus[wit]; // en la componente absoluta seleccionada, pondrá
                       // la dirección que apunta el puntero Actual

bus[wit] = 100; // a partir de la dirección que apunta el puntero Actual, pondrá
                // un 100 decimal (0b1100100) que ocupará 7 bits.
bus[wit]4 = 101; // a partir de la dirección que apunta el puntero Actual, pondrá
                 // un 101 decimal (0b1100101) acotado en 4 bits, es decir,
                 // solo 0b0101 (que es en decimal 5).
bus[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).
bus[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.