Primeros Pasos
SISTEMAS NUMÉRICOS EN GENERAL
Antes de que podamos aprender a programar en lenguaje Ensamblador, primero debemos revisar los distintos sistemas numéricos utilizados en dicha programación. Repasemos primero el sistema Decimal, con el que estamos más familiarizados. El sistema decimal se basa en diez, probablemente porque tenemos diez dedos, y contar con los dedos era la forma más simple de aritmética para los pueblos primitivos.
Piense en el número 123 por un momento. ¿Qué representa exactamente este número? Si pensamos en lo que aprendimos en la escuela, recordamos 1 centena, 2 decenas y 3 unidades, que sumados suman 123. Sin embargo, hay otra forma de ver este número. Resulta que cada dígito en el sistema decimal (Base 10) es una potencia de 10 mayor que el dígito inmediatamente a su derecha. Para aquellos que no recuerdan claramente qué es una potencia, ese término simplemente indica cuántas veces se multiplica la base por sí misma. Por ejemplo, 10 elevado a 3 es 10 x 10 x 10 = 1000, o 10 multiplicado por sí mismo 3 veces.
Ahora, volviendo al 123, recordamos que, en cualquier sistema numérico, el dígito más a la derecha es siempre la columna de las unidades. ¿Por qué es esto? Porque este dígito es siempre la base (en este caso, 10) elevada a la potencia de cero. Cualquier valor elevado a cero siempre es 1, por lo que este dígito es siempre el dígito de las unidades. En nuestro ejemplo obtenemos 3 x 1 = 3. El siguiente dígito, el 2 en este caso, representa la base 10 a la primera potencia, o 10. Como 2 x 10 = 20, obtenemos el dígito medio correcto para nuestro número. Finalmente, el dígito más a la izquierda, 1, representa la base 10 a la segunda potencia, o 100. Por lo tanto, este dígito representa 100 x 1, ó 100, y el número completo representa 100 + 20 + 3, o 123. Si ve el número esquemáticamente, este proceso se vuelve algo más fácil de seguir. En los ejemplos siguientes, siempre comenzamos desde la derecha y nos movemos progresivamente hacia la izquierda. Por ejemplo, podemos representar el número decimal 123 como:
La base | A la potencia de | Es igual a | Veces el dígito | Es igual al valor |
---|---|---|---|---|
10
|
0
|
1
|
3
|
3
|
10
|
1
|
10
|
2
|
20
|
10
|
2
|
100
|
1
|
100
|
Total = 123
|
Escojamos un número un poco más complicado y repasémoslo una vez más, usando 53.798.
La base | A la potencia de | Es igual a | Veces el dígito | Es igual al valor |
---|---|---|---|---|
10
|
0
|
1
|
8
|
8
|
10
|
1
|
10
|
9
|
90
|
10
|
2
|
100
|
7
|
700
|
10
|
3
|
1.000
|
3
|
3.000
|
10
|
4
|
10.000
|
5
|
50.000
|
Total = 53.798
|
EL SISTEMA NUMÉRICO BINARIO
Ahora que hemos visto cómo descomponer un número decimal, ese tipo de número que todos conocemos, pasemos a un sistema de numeración diferente: el sistema Binario. ¿Por qué binario? Las computadoras en realidad son dispositivos relativamente simples y la pieza fundamental de información que puede ser almacenada en ellas se llama bit o dígito binario. Un bit es la cantidad más pequeña de información; puede estar encendido o apagado, sí o no, 1 ó 0. En cierto sentido, un bit es como un interruptor de luz estándar.
Excluyendo los dimmers (atenuadores) por un momento, una luz puede estar encendida o apagada; No hay término medio. Un bit en una computadora se comporta exactamente de la misma manera. Esto explica por qué el sistema de numeración binario es un sistema tan natural para las computadoras. El sistema binario consta de sólo dos dígitos, 0 y 1. Por lo tanto, cualquier cosa representada en el sistema binario puede ser entendida inmediatamente por nuestra computadora, que en realidad sólo puede entender estos dos dígitos.
Aprender un nuevo sistema numérico puede ser una verdadera tarea, pero la haremos fácil. De hecho, todos los sistemas numéricos funcionan exactamente de la misma manera. La única diferencia entre ellos es la base utilizada. El sistema decimal, como hemos visto, utiliza como base el 10. El sistema binario utiliza el 2 como base. Tenga en cuenta que el dígito más grande en cualquier sistema de numeración es siempre uno menos que la base. Por ejemplo, 9 es el dígito más grande en base 10 y 1 es el dígito más grande en base 2. ¿Por qué? Porque tenemos que permitir el dígito cero, y en cada sistema numérico el número total de dígitos diferentes es igual a la base de ese sistema numérico.
Para mostrarle lo fácil que es entender el sistema binario, lo desarmaremos tal como lo hicimos con el sistema decimal, usando el número binario 10110110.
La base | A la potencia de | Es igual a | Veces el dígito | Es igual al valor |
---|---|---|---|---|
2
|
0
|
1
|
0
|
0
|
2
|
1
|
2
|
1
|
2
|
2
|
2
|
4
|
1
|
4
|
2
|
3
|
8
|
0
|
0
|
2
|
4
|
16
|
1
|
16
|
2
|
5
|
32
|
1
|
32
|
2
|
6
|
64
|
0
|
0
|
2
|
7
|
128
|
1
|
128
|
Total = 182
|
Por lo tanto, 10110110 en el sistema numérico binario es igual a 182 en el sistema numérico decimal. Probemos uno más, sólo que esta vez lo intentará usted mismo primero, antes de ver la respuesta, y luego lo resolveremos juntos a continuación. El número binario a convertir es 01011101.
La base | A la potencia de | Es igual a | Veces el dígito | Es igual al valor |
---|---|---|---|---|
2
|
0
|
1
|
1
|
1
|
2
|
1
|
2
|
0
|
0
|
2
|
2
|
4
|
1
|
4
|
2
|
3
|
8
|
0
|
8
|
2
|
4
|
16
|
1
|
16
|
2
|
5
|
32
|
0
|
0
|
2
|
6
|
64
|
1
|
64
|
2
|
7
|
128
|
0
|
0
|
Total = 93
|
¿Lo consiguió? El número binario 01011101 es el mismo que el número decimal 93.
Ahora sabemos cómo pasar de un número binario a un número decimal, pero... ¿Cómo invertimos el proceso para pasar de un número decimal a un número binario? Eso es aún más fácil. Simplemente tome su número decimal y divídalo sucesivamente por las potencias de 2, comenzando con la potencia más alta que se dividirá en su número decimal con un resultado de 1. Cada vez, divida el resto por la siguiente potencia inferior de 2. Por ejemplo, convierta 124 al sistema binario:
124/128 = 0 | con un resto de 124 | |
124/64 = 1 | con un resto de 60 | |
60/32 = 1 | con un resto de 28 | |
28/16 = 1 | con un resto de 12 | |
12/8 = 1 | con un resto de 4 | |
4/4 = 1 | con un resto de 0 | |
0/2 = 0 | con un resto de 0 | |
0/1 = 0 | con un resto de 0 |
El número 124 en el sistema decimal equivale a 01111100 en el sistema binario.
EL SISTEMA NUMÉRICO HEXADECIMAL
Ya casi hemos terminado con los sistemas numérico. Un paso más por recorrer y habremos terminado. Existe una forma mucho más sencilla de representar números que el sistema binario. Este sistema se llama sistema Hexadecimal. ¿Hexadecimales? Hexadecimal significa 16, y la base del sistema hexadecimal es, como era de esperar, 16. Ya sabemos que el dígito más grande en este sistema debe ser 15. ¡Espere un minuto! El número 15 no es un solo dígito. Entonces necesitamos una nueva forma de representar los números del 10 al 15. Los símbolos más fáciles de recordar son las primeras seis letras del alfabeto. Por lo tanto, en el sistema hexadecimal, el número 10 está representado por la letra A, el 11 por la B, y así sucesivamente, hasta el 15, que está representado por la letra F. Como la base del sistema hexadecimal es 16, los valores de los dígitos aumentan en potencias de 16. Tenemos un ejemplo preparado. Traduzcamos el número 6FC en nomenclatura hexadecimal al sistema decimal.
La base | A la potencia de | Es igual a | Veces el dígito | Es igual al valor |
---|---|---|---|---|
16
|
0
|
1
|
C
|
12
|
16
|
1
|
16
|
F
|
240
|
16
|
2
|
256
|
6
|
1.536
|
Total = 1.788
|
Entonces, el 6FC hexadecimal representa el decimal 1.788. En la mayoría de los artículos y textos de informática, los números hexadecimales están precedidos por un signo de dólar, por lo que la forma correcta de representar el número decimal 1.788 en la nomenclatura hexadecimal es $6FC. Para convertir de decimal a hexadecimal, divida tal como se muestra arriba, pero en lugar de dividir por potencias de 2, hágalo sucesivamente por potencias de 16:
1788/256 = | 6 | con un resto de 252 | |
252/16 = | 15 | (F) | con un resto de 12 |
12/1 = | 12 | (C) | con un resto de 0 |
Queda una conversión más, y esta es, con diferencia, la más fácil de todas. Usemos el número binario 10110111. Ya sabemos que es igual al número decimal 183 y podríamos convertirlo a su equivalente hexadecimal. Pero este es el camino más largo. Con frecuencia necesitaremos convertir de binario a hexadecimal, así que aprendamos cómo hacerlo directamente, en un paso muy sencillo.
Primero tomamos el número binario, 10110111 en este caso, y lo dividimos en dos partes, justo por la mitad. Si los 8 bits se llaman byte, entonces cada conjunto de 4 bits debería llamarse... nibble1. ¡Y así es! El nibble de orden superior es 1011 y el nibble de orden inferior es 0111. Cada uno de estos nibbles se puede convertir fácilmente en un solo dígito hexadecimal, ya que cuatro bits representan un número del cero al 15.
1 Bite (Mordida en inglés) suena a Byte (Término informático), y Nibble (Mordidita en inglés) suena y se escribe igual a Nibble (Término informático) (N. del T.).
1011 = | 1 ocho | = 8 | 0111 = | 0 ochos | = 0 | |
0 cuatros | = 0 | 1 cuatro | = 4 | |||
1 dos | = 2 | 1 dos | = 2 | |||
1 uno | = 1 | 1 uno | = 1 | |||
Total | = 11 (B) | Total | = 7 |
Por lo tanto, el equivalente hexadecimal de 10110111 es $B7, que se obtiene directamente sin utilizar ningún número decimal como intermediario (Fig. 2-1). Puede comprobar usted mismo que el número es el mismo sin importar cómo lo obtenga.
Para traducir de hexadecimal a binario, simplemente invierta el proceso anterior. Así es como se representa el número hexadecimal $FD en nomenclatura binaria:
F= | 1 ocho | D= | 1 ocho | |
1 cuatro | 1 cuatro | |||
1 dos | 0 doses | |||
1 uno | 1 uno | |||
1111
|
1101
| |||
11111101
|
ORGANIZACIÓN DE LOS DATOS
Ahora que puede convertir fácilmente números de una base a otra, hablemos por un momento acerca de cómo se organizan los datos en su computadora. Ya habrá notado que, en todos los ejemplos anteriores, los números binarios estaban organizados en grupos de ocho dígitos. En la jerga informática, 8 bits forman un byte. Cada ubicación de memoria2 en su ATARI almacena 1 byte de información. Debería ser evidente que, en el byte más grande posible, todos los bits son iguales a 1. Ahora, a partir de esto, puede calcular que el byte más grande que cualquier computadora puede almacenar corresponde al decimal 255. Siguiendo la misma lógica, solo hay 256 posibles bytes diferentes (Recuerde el cero). Entonces, ¿Cómo maneja la computadora números más grandes y cómo maneja más de 256 números diferentes?
2 El término Ubicación de Memoria es sinónimo de Posición de Memoria (N. del T.).
Las computadoras pueden manejar números mayores de dos maneras diferentes. Una es acoplando varios bytes para representar un solo número. Con esta técnica, un número de 2 bytes puede tener un tamaño tan grande como 256 x 256, o 65.536. Aunque normalmente no se utilizan números de 3 bytes en su ATARI, este sistema permite tener números tan grandes como 256 x 256 x 256, o 16.777.213. Como puede ver, esta técnica permitirá almacenar números muy grandes. El segundo método de almacenamiento de números grandes es utilizando números de Coma Flotante ("Floating Point" en inglés). Todos los números utilizados hasta ahora en este Capítulo han sido números enteros. En un número entero no pueden aparecer fracciones ni decimales. Sin embargo, no existen tales restricciones para los números de Coma Flotante. Números como 1.237 o 153,2 son números de coma flotante perfectamente válidos, mientras que no son números enteros válidos. El término coma flotante proviene del concepto de que la coma decimal puede flotar de un lugar a otro, como en los dos números decimales de coma flotante que acabamos de describir. En ambos casos, había cuatro dígitos en los números, pero en el primer caso, tres estaban a la derecha del punto decimal, y en el segundo, solo uno. ¿Cómo representamos esos números en una computadora?
En general, los números se codifican de manera que 1 byte representa la potencia de 10 por la que se multiplica el número, 1 byte representa el signo de esta potencia (si el número es mayor que uno, o entre cero y uno) y varios bytes representan la mantisa, o el número mismo. En otras palabras, podríamos codificar 153,2 como la siguiente secuencia de bytes:
En el esquema de codificación utilizado aquí, el primer dígito representa el signo del exponente, siendo 1 positivo y 0 negativo. El segundo dígito representa la potencia de 10 por la cual se multiplica la mantisa, o sea, 100. El resto de los dígitos representan el número en sí, y se entiende que el punto decimal está después del primer dígito. Por lo tanto, decodificando este número según estas reglas se obtiene:
Por supuesto, son posibles muchos otros esquemas de codificación, pero la idea principal es que, mediante la codificación de números, se pueden representar números muy grandes en una computadora, incluso sin utilizar ningún byte mayor que 255.
Hasta ahora, en nuestra discusión nos hemos concentrado completamente en números positivos. ¿Cómo manejamos los números negativos? Utilizando Aritmética Binaria con Signo. En este sistema, el bit de más a la izquierda, llamado el Bit Más Significativo, no representa una potencia de 2 en absoluto, sino que representa el signo del número. Es decir, si el bit más significativo es 1, el número es negativo y si el bit más significativo es cero, el número es positivo (Fig. 2-2). Una consecuencia de este sistema es que el mayor número con signo que podemos representar en 1 byte es +128 ó -127, ya que sólo tenemos 7 bits aritméticos con los que trabajar.
Aquí se justifica una nota de precaución: Si está utilizando aritmética con signo en un número de 2 bytes (y ATARI lo hace con frecuencia), solo el bit más significativo del byte más significativo (el byte que representa los dígitos más altos del número) es el bit de signo. Es decir, un número con signo de 2 bytes contiene 15 bits numéricos y sólo 1 bit de signo. Esto será muy importante más adelante, cuando entremos en la matemática de 2 bytes. Por supuesto, cuando usamos aritmética de Coma Flotante, necesitamos agregar a nuestro código 1 byte que representará el signo del número, es decir, si el número final representado es positivo o negativo, pero todos los esquemas de codificación utilizados tienen esto en cuenta.
TÉCNICAS DE DIRECCIONAMIENTO DE LA MEMORIA
En BASIC, hacer referencia a una ubicación de memoria específica es bastante simple y directo. Por ejemplo:
POKE 752,1
es un comando directo para colocar el valor 1 en la ubicación de memoria 752. Además, sabemos que la memoria máxima de acceso aleatorio disponible en una computadora ATARI estándar es 48K RAM. Con el Sistema Operativo ROM de 10K y otro espacio utilizado para otros fines específicos, la memoria total máxima permitida en un ATARI normal es de 64K, o 65.536 ubicaciones de memoria. Este número debería resultarnos algo familiar, ya que lo hemos encontrado antes. Es el número más grande que se puede codificar con 2 bytes.
El ATARI direcciona la memoria utilizando un sistema de 2 bytes, lo que le permite direccionar 65.536 ubicaciones de memoria diferentes. Cada computadora basada en el chip 6502 tiene la misma limitación incorporada en la cantidad de ubicaciones de memoria diferentes que se pueden direccionar. Entonces, ¿cómo pueden algunos ATARI contener más que esta cantidad de memoria? ¿Cómo pueden algunas computadoras basadas en el 6502 presumir de tener más de 64 KB de memoria total, ROM y RAM combinados?
El secreto de este aumento de direccionamiento de memoria es utilizar una técnica llamada Selección de Banco ("Bank Selecting" en inglés) de memoria. Con este procedimiento, se utiliza otro byte para controlar a qué banco de memoria hará referencia el direccionador de 2 bytes. Imagine una computadora con 16 bancos o niveles, cada uno de los cuales contiene 64 KB de memoria total. Sólo 1 de estos 16 bancos se puede utilizar a la vez, pero es posible que todos estén disponibles de vez en cuando. Si el byte selector de banco es igual a 0, se selecciona el primer banco, que contiene los 48 K de RAM normales y el Sistema Operativo ATARI. En estas condiciones, si el destinatario dice que quiere información de la ubicación 752, recupera información de la ubicación normal 752, como un ATARI no modificado. Sin embargo, si el byte selectivo de banco es igual a 1, se selecciona el primer banco de RAM de 64 K. Otro PEEK en la ubicación 752 elegiría ahora una ubicación en este banco de memoria, que probablemente contiene información totalmente diferente a la del ejemplo anterior.
Como probablemente pueda imaginar, algunos aspectos de la selección de bancos de memoria son particularmente difíciles de manejar. Por ejemplo, imagine ejecutar un programa BASIC almacenado en los 48K normales. A mitad del programa accedemos a un nuevo banco de memoria. De repente, la computadora pierde la pista del programa BASIC que estaba ejecutando, ya que el programa ya no está presente en el espacio direccionable de la computadora, al menos hasta que volvamos a seleccionar el banco apropiado. Esto provocaría un bloqueo y probablemente perderíamos tanto nuestro programa como la información a la que intentábamos acceder. Estos problemas se pueden superar hasta cierto punto, y los proveedores de software y hardware de terceros ya tienen productos en el mercado que permiten la expansión de su ATARI más allá del máximo habitual de 48K RAM. No existe ninguna razón teórica por la que no pueda tener un ATARI en tu casa con una memoria máxima direccionable de más de 16 millones de bytes (sí, ¡millones!). De hecho, no se sorprenda si pronto ve sistemas de expansión disponibles para ATARI que lo llevarán mucho más allá del máximo de 192K disponible actualmente. Dichos productos, junto con los dispositivos de almacenamiento masivo actualmente en desarrollo, permitirán que su ATARI ejecute programas nunca antes imaginados ni siquiera por el usuario más acérrimo. Para aprovechar estos sistemas, será necesario un conocimiento profundo de la programación en lenguaje Ensamblador y de la construcción de su ATARI, y el resto de este libro está dedicado a estas dos necesidades.
Índice de Contenido | Capítulo anterior | Siguiente capítulo