Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

La Conspiración del AND y el OR

–Y el olvido de la aritmética binaria–

Cualquier persona que haya tenido contacto con la programación de manera habitual sabe que todos los lenguajes de programación usados por la gente normal son mas o menos iguales al antiguo basic. Tienes una instrucción para leer datos, otra para desplegarlos, puedes realizar operaciones aritméticas con variables, escribir código condicional que puede o no ejecutarse y hacer ciclos que permiten llamar un conjunto de instrucciones varias veces. Las únicas tres diferencias entre un lenguaje y otro dentro de esta categoría son el nombre que reciben estas instrucciones, el uso que se le da a los signos de puntuación (eso que los académicos de esfinter apretado llama “reglas de sintaxis”) y una lista particular de procedimientos que alguien ya nos hizo el favor de escribir por nosotros que se conoce como API. Si alguna vez has programado en cualquiera de estos lenguajes solo tienes que aprender esas 3 cosas para considerarte que puedas dominar cualquier otro dentro de esas categorías.

Esto lo llamo ‘portabilidad del programador’ y permite que un programador promedio sea capaz de aprender a usar un lenguaje en tiempo razonable para poder mantener bajos los costos. Pero por supuesto que esta capacidad de hacer de los desarrolladores repuestos intercambiables no sería posible si no se mantuviera un mínimo de nivel de abstracción entre todos esos lenguajes. Y el nivel de abstracción suele ser tan alto que ni siquiera hace falta tener conocimientos sobre el propio sistema. Y por conocimientos básicos no me refiero a manejar el Office o escribir en un teclado sin mirarlo sino a cosas tan elementales como el mismísimo sistema binario.

Soy lo bastante viejo para recordar cuando en las escuelas de programación se enseñaba el sistema binario. Se nos decía que el cero era el redondo y el uno el flaquito. El único medio aceptado por las autoridades eclesiásticas para convertir un número a binario era el de hacer divisiones sucesivas entre dos y escribir los resultados de derecha a izquierda y el examen final consistía en hacer problemitas como sumas y restas en binario para lo cual había que convertirlas primero a decimal, hacer el problema y luego pasar el resultado a binario con el tedioso método de las divisiones. Tras uno o dos meses se nos enseñaban los secretos del INPUT y el PRINT (o como se llamaran estas dos instrucciones en el lenguaje que es estudiara) y luego unos pocos de los alumnos mas aventajados se les otorgaba el privilegio de hacer llamadas ultra-raras mediante una API o biblioteca de funciones incluida en el compilador. Lo interesante era que una vez que se abandonaba el tema de los números binarios estos no se volvían a tocar nunca mas en la vida. De hecho yo no recuerdo haber visto nunca que se hablara tan siquiera que los datos almacenados en las variables en realidad estaban guardados en binario y que lo que iba y venia de un lado a otro no eran mas que representaciones legibles por no iniciados en formato de cadena ASCII. Si acaso unos pocos aventurados se llegaron a preguntar alguna vez porqué había una relación entre un tipo de una variable y su tamaño o porqué los números máximos que podían guardar no eran ‘redondos’. Solo había que recordar que había una manera de trabajar con números y otra con palabras.

En los lenguajes ‘normales’ solo existe diferencia entre palabras y números. Las palabras se leen, escriben y guardan mientras que con los números se pueden hacer operaciones matemáticas típicas de educación básica como sumas, restas, multiplicaciones y divisiones. Cuando queremos hacer un código condicional evaluamos si una condición es cierta o falsa al final de algún cálculo o directamente leyendo las variables. No hay ninguna necesidad de volver a ver ese horrible sistema binario que tantos malos ratos nos trajo cuando empezamos con esto de las computadoras.


¡AND y OR también son operadores aritméticos!

Y aquí es donde entra el asunto del AND y el OR. Cualquier desarrollador que no sepa nada de Ensamblador lo primero que le viene a la mente al ver estas palabras es IF. AND y OR ya sea representados por estas palabras o por símbolos no son mas que unas cosas que se usan para hacer código condicional y unir una serie de condiciones como por ejemplo ver si un número se encuentra en un rango dado o si se cumple cualquiera de una serie de condiciones. El gran secreto que parecen estar ocultando todos los que reciben sus tres salarios mínimos por enseñar a programar es el siguiente: AND y OR también son operadores aritméticos.

Así como lo oyen. AND y OR también pueden utilizarse como operadores en una instrucción aritmética como se usan los signos + y *. Es decir que así como podemos sumar o multiplicar un par de números, también podemos ANDearlos y ORearlos. Al final de esta nota voy a comentar de manera superficial las cosas increibles que un programador puede hacer usando AND y OR como operadores aritméticos, por ahora lo que quiero discutir es el porqué todos los institutos parecen haberse puesto de acuerdo para evitar que esta información salga a la luz.

Opino que la única razón por la que no se enseña el AND y el OR como operadores aritméticos es porque estas operaciones solo tienen sentido en el sistema de numeración binaria. Y para que un lenguaje de programación quede en la categoría mencionada al inicio de esta entrada debe de abstraerse por completo de los números binarios. Otras razones que se me ocurren van desde simplemente porque a quienes les pagan por enseñar los educaron así o porqué AND y OR no pueden ser usados de esta manera en todos los lenguajes de la misma manera. Cabe la posibilidad de que se trate de simple falta de interés o porque crean que no lo van a necesitar. Y como ya dije, opino que la única razón por la que no quieren manejar el AND y el OR como operadores aritméticos es porque no quieren volver a ver números binarios.

Por si hay alguien por ahí que todavía no sepa de lo que estoy hablando lo que pasa con dos números a los que se les hace un AND o un OR es lo siguiente: Primero se escriben ambas cantidades en formato binario una sobre otra de modo que los bits con el mismo valor posicional queden alineados verticalmente. A continuación se hace la operación binaria AND u OR en cada pareja de bits. El bit que de como resultado se guarda en la misma posición que tenían los bits procesados. EN OR basta con que cualquiera de los bits sea uno para que el resultado sea 1 mientras que en AND ambos deben de estar a uno o de lo contrario el resultado será un cero. Pero me imagino que esto ustedes ya lo saben o de lo contrario no estarían leyendo un documento como este. Por ahora voy a deberles los ejemplos porque esta entrada ya quedó demasiado grande y no quiero aburrirlos pero les aseguro que el AND y el OR como operadores aritméticos son muy útiles para hacer códigos mas rápidos sobre todo cuando se trata de comparaciones y código condicional.

Por ahora solo me queda comentar que no había podido escribir porque no tenía nada bueno que decir. Pero me alegra que por ahí todavía quedan unas pocas personas que si les interesa programar en ensamblador. Mientras exista gente interesada en el ASM ahi afuera voy a seguir escribiendo. No importa si son pocos, pues esto del ASM no es una cuestión de fe, un programador adopta el ensamblador como su lenguaje principal después de haber comprobado por si mismo su gran poder. Y haré por otros lo que unos pocos, pero muy pocos hicieron por mi en épocas pasadas.

Anuncios

agosto 29, 2011 - Posted by | Uncategorized | ,

4 comentarios »

  1. Pues yo me he quedado con las ganas de esos ejemplos…

    Añadir que con el AND, NOT y OR se pueden hacer los otros operadores XOR, XNOR, y demases, aunque ya casi todos los procesadores tienen instrucciones que lo hacen sin tener que hacerlo a mano (en ensamblador claro). Esto se ve muy claro en el Minecraft por ejemplo, cuando estás programando con el redstone, tu unicamente posees puertas lógicas de tipo not, and y or, pero puedes montar “dispositivos” que funcionan como el XOR, XNOR, NOR o NAND.

    Usando estos operadores se pueden hacer verdaderas curiosidades como almacenar en un byte una serie de registros para ahorrar memoria. También molan los desplazamientos de bit para ahorrar en ciertos casos burradas de cálculos como multiplicaciones o divisiones a procesadores antiguos (aunque hoy en día con lo que hay nadie se preocupa por ello)

    Comentario por JuDelCo | agosto 29, 2011 | Responder

    • Interesante lo que comentas “…aunque ya casi todos los procesadores tienen instrucciones que lo hacen sin tener que hacerlo a mano (en ensamblador claro). …” Y para usar esas instrucciones no necesitas del Lenguaje Ensamblador o en su defecto lenguage Maquina.

      Comentario por b1ackpig | agosto 29, 2011 | Responder

  2. Concretamente esa parte de lo que dije no la tengo muy clara, igual me he colado. Lamento si confundo a alguien, yo también soy un aprendiz en estos lares

    Comentario por JuDelCo | agosto 29, 2011 | Responder

  3. Me parece que lo que quiso decir es que ya existen en lenguaje maquina instrucciones como XOR que pueden llamarse en lugar de combinar dos AND dos NOT y un OR. Pues A xor B es NOT(A)AND(B) OR (A)AND(NOT(B))

    Recuerdo de principiante cuando hacia el complemento a dos (NEG o cambio de signo) Haciendo un NOT y un INC. Luego supe que ya existia una instruccion llamada NEG que ya hacia eso en un solo paso.

    Comentario por asm86 | agosto 31, 2011 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: