Fundamentos del lenguaje máquina. Sistema de numeración.
La dificultad del lenguaje máquina a veces se ha exagerado. Comparado con un lenguaje de programación de alto nivel, hay algunas nuevas reglas que aprender y algunos nuevos hábitos que se deben adquirir, pero la mayoría de los programadores estarían de acuerdo en que el lenguaje máquina no es mucho más difícil de entender que por ejemplo el popular BASIC. De hecho, muchos de los primeros informáticos que se iniciaron en la década de 1970 aprendieron lenguaje máquina antes de aprender BASIC, y curiosamente, algunos de estos pioneros encontraban BASIC tan difícil de entender cómo el lenguaje máquina. En ambos casos, el problema era que las reglas de un nuevo lenguaje de programación, simplemente son "oscuras" hasta que se las conoce. La realidad es que en general, aprender ambos lenguajes probablemente requiera más o menos la misma cantidad de esfuerzo. Lo primero que se debe aprender acerca del lenguaje máquina es que es un reflejo de cómo se construyen los ordenadores. Es más, a menudo verás que utiliza un sistema de numeración hexadecimal el cual no está basado en diez.
¿Cuál es un sistema de numeración natural?
Las computadoras cuentan en grupos de dos. Es un hecho de la electrónica que la forma más fácil de almacenar y manipular la información es por los estados ON-OFF. Una bombilla de luz está encendida o apagada. Se trata de un grupo de dos, es binario, por lo que las potencias de dos se convierten en las agrupaciones naturales para contadores electrónicos. 2, 4, 8, 16, 32, 64, 128, 256. Hemos estado usando decenas tanto tiempo que hemos llegado a pensar que es el mejor sistema de numeración. Sin embargo no lo es. Lo que es más natural es en base dos. Base dos es una forma más eficiente de contar. La programación en lenguaje máquina se puede hacer en decimal pero por lo general no se hace así. La mayor parte de programación en lenguaje máquina implica números hexadecimales. Esto significa que son grupos de 16 en lugar de 10.
Descarga nuestra guía gratuita: Lo que debes saber si quieres estudiar informática
¿Por qué no se programa con un sistema de numeración decimal que es más familiar? La razón es que 16 es una de potencia de 2. Por lo tanto es una agrupación más conveniente para el lenguaje máquina ya que organiza los números de la misma forma en que la computadora lo hace. Por ejemplo, todos los equipos trabajan, en el nivel más elemental, con bits. Un bit es la pieza más pequeña de información posible: algo está encendido o apagado, sí o no, más o menos, verdadero o falso. Esta condición de dos estados (binario) puede ser recordado por una sola celda de memoria. Esta única celda se llama un bit. El ordenador puede cambiar cada bit a "on" u "off", como si se tratara de una bombilla o una bandera (flag) levantada o bajada. El bit es esencial en la informática. Imaginemos que queremos recordar el resultado de una resta. Cuando se restan dos números, en realidad están siendo comparados entre sí. El resultado de la resta nos dice qué número es el más grande o si son iguales. El lenguaje máquina tiene una instrucción que compara dos números por sustracción. Se llama CMP. Esta instrucción establece flags en la CPU (Central Processing Unit), y uno de esos flags siempre recuerda si el resultado de la acción más reciente tomada por el ordenador era un cero o no. Lo que tenemos que entender de esto en estos momentos es que cada flag tiene dos condiciones posibles: arriba o abajo. En otras palabras, esta información (cero o no cero) es binaria y se puede almacenar dentro de un solo bit. Cada uno de los flags es un bit. Juntos forman un byte. Ese byte es llamado estado de registro.
Asignaciones de bytes
Nuestros ordenadores agrupan estos bits en unidades de ocho, llamados bytes. Ocho es también una potencia de dos. El ocho es un número ideal de bits con los que poder trabajar como un grupo ya que podemos contar de cero a 255 utilizando sólo ocho bits. Esto nos da suficiente espacio para asignar las 26 letras del alfabeto (y las letras mayúsculas y signos de puntuación, etc.) de manera que cada carácter impreso tendrá su número particular. La letra "A" (en mayúsculas) se le ha asignado el número 65. "B" es 66, y así sucesivamente. Estas "asignaciones" forma la convención llamada código ASCII por el cual los ordenadores de todo el mundo pueden comunicarse entre sí. El texto puede ser enviado a través de módems y líneas telefónicas y llegar significando lo mismo a un equipo diferente. Es importante visualizar cada byte, entonces, como ocho bits que se acoplan entre sí y son capaces de representar a 256 cosas diferentes. Como ya habrás adivinado, 256 es una potencia de dos también (dos elevado a ocho). Por lo tanto, estos grupos de ocho, estos bytes, son un aspecto clave de la informática. Pero también queremos simplificar el conteo de 0 a 255. Queremos que los números se alinean en una columna en la pantalla o en papel. Obviamente, el número decimal de cinco ocupa un espacio y el número 230 ocupa tres espacios. Además, es más fácil pensar en hexadecimal en términos de números binarios, que es como el ordenador gestiona los números:
Decimal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Hex 01 02 03 04 05 06 07 08 09 (observa estos nuevos dígitos) ⇒ 0A 0B 0C 0D 0E 0F (observa la nueva columna en hexadecimal) ⇒ 10 11 | Binario 00000001 00000010 00000011 (1 + 2) 00000100 00000101 (4 + 1) 00000110 (4 + 2) 00000111 (4+2+1) 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000 00010001 |
Fíjate en la fila del 16 decimal. Ahí tenemos el hexadecimal $10 (los números hexadecimales están precedidos generalmente por un signo de dólar para demostrar que no son decimales) que parece a un número binario. Si divides este número hexadecimal en dos partes, 1 y 0, y el binario de la siguiente columna (que es un grupo de ocho bits, un byte) en dos partes, 0001 y 0000, se puede ver perfectamente la relación.
Conclusión
Los programadores de lenguaje máquina a menudo manejan números hexadecimales, es decir, grupos de dieciséis en lugar de diez. Por lo general puedes verlo abreviado como hex. Pero recuerda que en lenguajes como Simple Assembler se puede elegir entre trabajar en hexadecimal o decimal con ese ensamblador.