Último OCB: Día 1

This commit is contained in:
jota 2022-01-15 11:12:40 -03:00
parent e15b55c477
commit 4e223c0411
1 changed files with 24 additions and 17 deletions

View File

@ -237,9 +237,9 @@ uxntal es el lenguaje ensamblador para la máquina uxn.
estuvimos hablando antes sobre el cpu uxn y las 32 instrucciones que sabe cómo ejecutar, cada una de ellas codificada como una sola palabra de 8 bits (byte).
ese lenguaje ensamblador uxntal implica que hay una relación uno a uno mapeando de una instrucción escrita en el lenguaje a una palabra de 8 bit correspondiente que el cpu puede interpretar.
que uxntal sea un lenguaje "ensamblado" implica que hay una relación uno a uno mapeando de una instrucción escrita en el lenguaje a una palabra de 8 bit correspondiente que el cpu puede interpretar.
por ejemplo, la instrucción ADD (suma) en uxntal es codificada como un byte con el valor 18 en hexadecimal, y corresponde al siguiente conjunto de de acciones: toma los dos elementos superiores de la pila, los suma, y empuja el resultado a la pila.
por ejemplo, la instrucción ADD (suma) en uxntal es codificada como un byte con el valor 18 en hexadecimal, y corresponde al siguiente conjunto de acciones: toma los dos elementos superiores de la pila, los suma, y empuja el resultado a la pila.
en sistemas de tipo forth podemos ver el siguiente tipo de notación para expresar los operandos que una instrucción toma de la pila, y el(los) resultado(s) que empuja devuelta a la pila:
@ -272,7 +272,7 @@ ensamblémoslo y corrámoslo:
$ ./bin/uxnasm hola.tal bin/hola.rom && ./bin/uxnemu bin/hola.rom
```
veremos una salida con el siguiente aspecto:
se abrirá una ventana negra, y en la consola veremos una salida parecida a la siguiente:
```
Assembled bin/hola.rom(5 bytes), 0 labels, 0 macros.
@ -329,17 +329,17 @@ leyendo el programa de izquierda a derecha, podemos ver el siguiente comportamie
¿y qué es el dispositivo de entrada/salida con la dirección 18?
mirando en la tabla de dispositivos de la referencia varvara, podemos ver que el dispositivo con la dirección 1 en el nibble superior es la consola (entrada y salida estandard), y que la columna con la dirección 8 corresponde a "escritura".
mirando en la tabla de dispositivos de la referencia varvara, podemos ver que el dispositivo con la dirección 1 en el nibble superior es la consola (entrada y salida estandard), y que la columna con la dirección 8 corresponde al puerto "escritura".
=> https://wiki.xxiivv.com/site/varvara.html varvara
asique, el dispositivo 18 corresponde a "escribir en consola", o salida estándar.
así que, el dispositivo 18 corresponde a "escribir en consola", o salida estándar.
¡nuestro programa está enviando el valor hexadecimal 68 (carácter 'h') a la salida estandard!
puedes ver los valores hexadecimales de los carácteres ascii en la siguiente tabla:
=> https://wiki.xxiivv.com/site/ascii.html ascii table
=> https://wiki.xxiivv.com/site/ascii.html tabla ascii
### números literales
@ -355,7 +355,14 @@ podemos ver que el ensamblador reporta que nuestro programa es de 5 bytes de tam
Assembled bin/hola.rom(5 bytes), 0 labels, 0 macros.
```
para el curioso (¡como tú!), podemos usar una herramienta como hexdump para ver sus contenidos:
podemos confirmarlo usando el programa wc (word count):
```
$ wc --bytes hola.rom
5 hola.rom
```
para le curiose (¡como tú!), podemos usar una herramienta como hexdump para ver sus contenidos:
```
$ hexdump -C bin/hola.rom
@ -365,7 +372,7 @@ $ hexdump -C bin/hola.rom
80 es el "opcode" correspondiente a LIT, y 17 es el opcode correspondiente a DEO. ¡y ahí están nuestros 68 y 18!
¡osea, efectivamente, nuestro programa ensamblado presenta una correspondencia uno a uno con las instrucciones que acabamos de escribir!
¡o sea, efectivamente, nuestro programa ensamblado presenta una correspondencia uno a uno con las instrucciones que acabamos de escribir!
de hecho, podríamos haber escrito nuestro programa con estos números hexadecimales (el código máquina), y hubiera funcionado igual:
@ -405,9 +412,9 @@ las runas son carácteres especiales que indican a uxnasm algún pre procesamien
## runa de pad absoluto
ya vimos la primera de ellas: | define un pad absoluto: la dirección donde el siguiente elemento escrito será ubicado en memoria.
ya vimos la primera de ellas: | define un pad absoluto, o sea, la dirección donde el siguiente elemento escrito será ubicado en memoria.
si la dirección es de 1 byte de longitud, es asumido que es una dirección de el espacio de entrada/salida o de la página cero.
si la dirección es de 1 byte de longitud, es asumido que es una dirección del espacio de entrada/salida o de la página cero.
si la dirección es de 2 bytes de longitud, es asumido que es una dirección de la memoria principal.
@ -424,7 +431,7 @@ usando esta runa, podemos reescribir nuestro primer programa como:
|0100 #68 #18 DEO
```
el siguiente tendría el mismo comportamiento que el programa de arriba, pero usando un byte menos (en la siguiente sección/día veremos por qué)
el siguiente tendría el mismo comportamiento que el programa de arriba, pero usando un byte menos (en el siguiente día veremos por qué):
```
( hola.tal )
@ -437,13 +444,13 @@ importante: recuerda que esta runa (y las otras con la palabra "literal" en su n
si sólo queremos tener un número específico en la memoria principal, sin empujarlo a la pila, simplemente escribiríamos el número tal cual, "crudo". esta es la forma en que lo hicimos en nuestros primeros programas de arriba.
## runa de carácter crudo o "raw"
## runa de carácter crudo o "raw"
ésta es la runa de carácter crudo: '
nos permite que uxnasm decodifique el valor numérico de un carácter ascii.
nuestro "programa hola" luciría de la siguiente manera, usando las nuevas runas que acabamos de aprender:
nuestro programa "hola" luciría de la siguiente manera, usando las nuevas runas que acabamos de aprender:
```
( hola.tal )
@ -460,7 +467,7 @@ por eso debemos incluir una instrucción LIT.
## runas para etiquetas
incluso ahora que sabemos que #18 corresponde a empujar la dirección de dispositivo escribir en consola en la pila, por legibilidad y para asegurar nuestro código a futuro es una buena práctica asignar una serie de etiquetas que corresponderán a ese dispositivo y sus sub direcciones.
incluso ahora que sabemos que #18 corresponde a empujar la dirección de dispositivo escribir en consola en la pila, por legibilidad y para asegurar nuestro código a futuro, es una buena práctica asignar una serie de etiquetas que corresponderán a ese dispositivo y sus sub direcciones.
la runa @ nos permite definir etiquetas, y la runa & nos permite definir sub etiquetas.
@ -490,7 +497,7 @@ luego tenemos varias sub etiquetas, indicadas por la runa &, y pads relativos, i
nada de esto sería traducido a código máquina, pero nos asiste al escribir código uxntal.
la runa para referirse a una dirección literal en la página cero o el espacio de direcciones de entrada/salida, es . (punto), y una / (barra) nos permite referirnos a una de sus sub etiquetas.
la runa para referirse a una dirección literal en la página cero o el espacio de direcciones de entrada/salida es . (punto), y una / (barra) nos permite referirnos a una de sus sub etiquetas.
recuerda: al ser una runa de "dirección literal" va a agregar una instrucción LIT antes de la correspondiente dirección :)
@ -572,7 +579,7 @@ usando todos estos macros y runas, nuestro programa puede terminar luciendo como
termina siendo ensamblado en los mismos 25 bytes que los ejemplos de arriba, pero con suerte más legible y mantenible.
podemos "mejorar" este programa haciendo que un loop imprima los carácteres, pero estudiaremos eso más tarde :
podemos "mejorar" este programa haciendo que un loop imprima los carácteres, pero estudiaremos eso más tarde :)
# ejercicios
@ -617,7 +624,7 @@ recordemos que el número tendría que ser escrito como un byte completo para qu
en el {tutorial de uxn día 2} empezamos a explorar los aspectos visuales de la computadora varvara: ¡hablamos sobre los aspectos fundamentales del dispositivo de pantalla para que podamos empezar a dibujar en el!
¡sin embargo, te invito a tomar un pequeño descanzo antes de continuar! :)
sin embargo, ¡te invito a tomar un pequeño descanzo antes de continuar! :)
# apoyo