Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Pequeños Códigos Hacen Grandes Sistemas

–Reune las partes y construye tu software–

¿Qué es mejor para un programador? ¿Un código que funciona pero no sabe como ni porqué o un pseudocódigo que sabe perfectamente como funciona pero que no tiene idea de como introducir en una computadora?

Para una persona normal no hay duda de que lo mejor es el código que ya funciona pero para el programador no es una decisión facil. Unos podrian decir que puede estudiar el código que ya funciona y a partir de ahí hacer el suyo. Esto es posible pero no siempre es la mejor opción.

Esta nota la escribo porque estoy pensando como compartir información sobre código y no se exactamente qué es lo que tengo que publicar. Pues como ya saben intento explicar las cosas de la misma manera en la que a mi me hubiera gustado que alguien me las explicara cuando comenzaba a programar. Recuerdo la frustración que sentía en aquellos años al intentar descifrar los símbolos inexplicables que formaban los códigos de programación y luego cuando intentaba introducirlos a la computadora sin saber que estos no hicieran lo que creía que debian hacer. Pero en esos libros de códigos indescifrables y términos que me sonaban por completo ajenos había algo que mi limitada mente podía entender: Los algoritmos.

Ya una vez comenté que el primer libro de programación que compré fue uno sobre algoritmos. En esos tiempos no sabía ni lo que significaba la palabra ni mucho menos la diferencia entre un algoritmo y un código de programación. Pero leyendo ese libro hasta donde pude entenderlo pude aprender como hacer algunas cosas como por ejemplo calcular un cerco envolvente o unir un montón de puntos de manera que no se cruzaran entre ellos. Detectar una secuencia de símbolos en un texto y por supuesto ordenar listas de números y buscar algo entre ellas. ¡Pero no sabía programar!

Así es. Conocía como hacer muchas cosas en papel y lapiz y más adelante que tuve en mis manos documentos como los manuales de intel también sabía como funcionaba un CPU y las cosas que era capaz de hacer pero aún así no podía hacer ningún programa. Para explicarlo contaré una vieja anécdota de programación:

Cuando empezaba a programar sabía por muchos escritos que había leido sobre como funcionaba una PC de aquel entonces que si quería escribir imágenes directo en pantalla necesitaba primero inicializar el modo gráfico y luego escribir en a partir de la posición de memoria A0000h. Que cada byte era uno de 256 posibles colores y que una pantalla de 320×200 pixeles ocupaba una región de memoria de 64000 bytes. Sabía lo que tenía que hacer pero no como hacerlo.

Lo peor era cuando iba y le preguntaba a los que yo creía que sabian del tema: Parecía que el hecho de que ya supiera lo que tenía que hacer pero no como hacerlo los hacía enojar más que si les preguntara desde cero como hacer las cosas. Recuerdo haber recibido toda clase de respuestas absurdas como cuando una vez pregunté como podía hacer para evitar que el buffer de teclado se desbordara y sonara ese sonido de campanita un alumno de últimos semestres me dijo que abriera la PC y le quitara la bocina interna.

Al final pude hacer ambas cosas con un viejo compilador de C de 16 bits usando punteros largos y guardando los punteros a funciones de los vectores de interrupción pero esas cosas eran demasiado revoltosas para hacerlas en C y las hacía metiendo instrucciones de ensamblador inline en el código en C. Y el resto de la historia ya la saben: Llegó el momento en el que decidí programar todo completamente en ensamblador para evitarme problemas.

El asunto es que hubo una época bastante larga en la que sabía muchas cosas pero no programaba nada de nada. Pero hubo un momento en el que comencé a programar usando todo lo que ya había averiguado y me volví imparable a partir de entonces. No estoy seguro de como ni por qué pero en ese tiempo comencé a programar por ráfagas. Unos cuantos meses al año escribia muchos programas y el resto lo dedicaba a leer y aprender. Hasta la fecha he intentado dedicar más tiempo a programar sin dejar por ello de aprender.

¿Pero a qué viene todo esto? Pues como dije al principio quiero compartir código pero no quiero subir instrucciones que nadie entienda ni tampoco quiero subir explicaciones que sean cansadas de leer. Para que me entiendan lo que quiero es escribir piezas pequeñas de código y empaquetarlas de manera sistemática para hacerlas fáciles de leer y entender. Hasta ahora cada paquete incluirá un poco de código en ensamblador, un texto explicando como funciona y una serie de imágenes o pequeños archivos de video para explicar algo. Lo que todavía no se es que tanto partir los programas.

Cada parte es util por si misma
Pero en equipo constituyen una fuerza imparable

Un programa completo en ASM es demasiado grande y describir su funcionamiento a alguien que no ha programado nunca requeriría miles de páginas de texto. Así que lo mejor es partir ese programa en partes intercambiables que puedan usarse en proyectos más grandes. Pero si parto esos programas en partes muy pequeñas tampoco es bueno, pues para empezar el programa no se podría compilar ni ejecutar y si las partes fueran lo bastante pequeñas no serian más que unas pocas instrucciones que en realidad no harian nada. Sería casi mejor hablar sobre cada OpCode. La idea es que esas partes sean lo bastante elaboradas para hacer algo apreciable y a la vez lo bastante sencillas para detallar su funcionamiento en una entrada como esta. Lo interesante sería ver funcionar cada una de estas partes por separado y esa es la parte que me falta resolver.

Ahora que lo veo con calma este proyecto me recuerda a aquellos antiguos cursos de modelismo por correspondencia en los que cada semana salia a la venta un fascículo impreso que incluia una pieza de un barco o avión para armar. Si el aficionado tenía la suficiente paciencia para comprar la revista durante meses sin perderse ni un solo número al final podía armar su modelo a escala y lucirlo en una repisa junto con toda la colección de tomos a modo de pequeña enciclopedia de ese modelo a escala en particular.

Si, ya se lo que están pensando: I“Otra vez el que escribe esto va a comenzar un nuevo proyecto que no va a terminar nunca” ¿Y saben una cosa? ¡Tienen razón!

Este proyecto no se va a terminar nunca porque no va a tener fin. Cada que me de la gana liberaré uno de estos paquetes aparentemente inservibles con código incluido y explicaré su funcionamiento de manera exhaustiva. Estas pequeñas unidades de por si ya sirven para algo aunque sea poco pero su verdadera utilidad será cuando trabajen unas con otras. Algo así como esos robots gigantes de las antiguas series japonesas que se construian a partir de vehículos que también podian funcionar por separado. Aunque aquí esas unidades independientes podrian construir muchos robots gigantes diferentes dependiendo de como se conecten unas con otras.

En fin, en cuanto averigue un formato conveniente para sacar a la luz estas partes intercambiables las sacaré una por una. Aunque debo advertirles de una buena vez de que si quieren ver estas partes funcionar de manera separada van a necesitar un debugger y algunas partes muy básicas sin las cuales las piezas no serian compilables. Obvio esas partes indispensables serán las primeras que voy a soltar. Ahora por lo menos necesito un lugar donde poder subir archivos y el resto será historia. Allá va un proyecto que nunca voy a terminar pero esta vez no se terminará porque se trata de un proyecto que no va a tener fin.

Anuncios

julio 9, 2015 - Posted by | Uncategorized

9 comentarios »

  1. Me gustaria ver un cubo que gira sobre un eje cualquiera, sin usar OpenGl ni Direct3D. A puro calculo de coprocesador matematico. Valdria la pena ver como se almacena en memoria los datos a procesar, ver como se hace una proyeccion, recorte y rasterisacion.

    Algo asi como: Graficas por computadora. Haga girar un cubo sobre su propio eje en 32 ejemplares quincenales. En esta edicion, como armar con numeros de coma flotante sus propios modelos en 3D, ademas de regalo Matrices, que son y como funcionan, por solo 12€

    En cuanto a donde subir el material, dropbox seria una buena opcion.

    Comentario por Diego | julio 11, 2015 | Responder

    • La mejor parte de esta colección es que las partes son intecambiables. El código de coprocesador puede servir para rotar un cubo o para mostrar una puntuación mientras que al proyecto del cubo puede cambiarsele la pieza del coprocesador y ponerle una de Streaming Simd Extensions. La idea es que cada quién arme su propio proyecto a partir de las partes. Yo solo pongo las partes y sugiero ideas

      Comentario por asm86 | julio 11, 2015 | Responder

  2. Que tal Mario, no necesitas un lugar para subir archivos, usa data uris

    https://en.wikipedia.org/wiki/Data_URI_scheme
    http://stackoverflow.com/questions/6955860/filename-of-downloaded-file-in-dataapplication-octet-stream

    en tu propio blog puedes publicar el archivo con los data uirs.

    ejemplo:

    Bajar Archivo

    Comentario por b1ackpig | julio 13, 2015 | Responder

    • Este es el ejemplo, por alguna estraña razon lo convirtio en una liga, va de nuevo:

      Bajar Archivo

      Comentario por b1ackpig | julio 13, 2015 | Responder

      • otra vez:

        a href=”data:application/octet-stream;charset=utf-16le;base64,UHJvZ3JhbWFuZG8gZW4gbGVuZ3VhamUgZW5zYW1ibGFkb3IgZXMgZGl2ZXJ0aWRvIDotRA==” download=”test.txt”>Bajar Archivo

        Comentario por b1ackpig | julio 13, 2015

      • ¿De que va el ejemplo? Me interesa saber ¿Podrias subirlo de nuevo?

        Comentario por Diego | julio 15, 2015

      • para subir textos como códigos, links o cualquier otra cosa les recomiendo usar pastebin.com Ahi pegas o escribes el texto y al oprimir un boton te da un link o lo copias de la barra de direcciones. Ya ese link lo pegas en los comentarios como ancla o si el sistema lo permite lo puedes escribir directamente

        Comentario por asm86 | julio 15, 2015

  3. Tenia tiempo sin comentar pero nunca deje de seguir el blog.
    Ahora bien, no se que tanto hayas avanzado con la puesta en marcha del proyecto y posiblemente algo de lo que vaya a decir te parecerá redundante, pero aun así intentare aportar con algunas sugerencias a continuación.
    Para gestionar todo lo que vayas haciendo en este apartado podrías usar Github (también puedes elegir entre Bitbucket, Gitorious o cualquier otro sitio que permita el uso de repositorios git). Con un sistema de control de versiones probablemente te sea mas sencillo mantener organizado todo el código que vayas haciendo (ademas de permitir que los demás aporten correcciones/mejoras e incluso nuevas implementaciones, todo de forma sencilla).
    En cuanto a “como programar todo”, quizás te interese aplicar la filosofía UNIX (en especial lo de “hacer una cosa y hacerla bien”) aunque depende mucho de lo que quieras hacer y su complejidad.
    Por otro lado, lo que se me ocurre para tener un diseño modular y mantenible de cada parte seria:
    * Hacer librerías con la cantidad de funciones que creas conveniente y tan atómicas como precises (las cuales se podrían usar a través de un “programa cargador parametrizable” diseñado para tal fin o bien cargarlas con OllyDbg).
    * Un ejecutable independiente en donde le puedas pasar parámetros por la linea de comandos (o por la entrada estándar, con esto ademas se abriría la posibilidad de conectar los programas con el uso de tuberías/redirecciones/pipes tal como se hace en Linux).

    De este modo puedes hacer un post con la parte teórica detallando el funcionamiento de ese componente y con partes de (pseudo)código para que quede mas claro. Por otro lado, en Github (o el sitio de tu preferencia) subes el código fuente con algunos comentarios en las partes mas importantes/complejas para que así cualquiera lo pueda probar o reutilizar.
    Un proyecto que me viene a la mente con un enfoque parecido es NextDivel (la teoría la encuentras como Emulando a Linus Torvalds: Crea tu propio sistema operativo desde 0 por lo que ya te puedes dar una idea sobre que trata).
    P.S.: Si también te interesa tener ejecutables a modo de demostración, GitHub permite hacer “releases” tal como se explica aquí.

    Comentario por Swicher | agosto 2, 2015 | Responder

  4. Te referis a la falta de talento, o lo que es lo mismo para los recien iniciados, la falta de practica… No es algo que se pueda enseñar de ningun puto modo a no ser que sea por palazos en la cabeza… Es muy raro que exista alguien que lo haga con naturalidad como si hubiera nacido para eso…

    Bueno, te adelanto que tengo grandes ideas para lo que estas redactando, pero necesito un poco mas de tiempo antes de tirarme a ello, y para cuando esté terminado, tendriamos un Asembler de facil uso y util para la actualidad.
    Aunque si no te interesa mi idea y/o tampoco queres esperar, podrias revivir temas viejos de Asembler como la exploración de las primeras BIOS, aunque eso seria muy inutil. Otra opcion seria tambien el arranque de la MBR y su escalado a los modos de 16 bits a 32 bits, y a 64 bits. Aunque todo eso terminaria por matar a cualquiera…
    No es una novedad tu metodo de explicar, he visto libros de asembler explicarlo con la misma sencillez, pero en su epoca eran programas profesionales mas livianos y se podia terminar de explicar todas sus partes…

    Comentario por RmBeer | junio 15, 2017 | 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: