sábado, 24 de noviembre de 2012

Tutorial de ensamblador x86. Capítulo 1. Introducción al ensamblador



Hola a todos,

Bienvenidos a este primer capítulo del tutorial de ensamblador. Antes que nada, deberíamos ponernos en situación

Que es el ensamblador?
El lenguaje ensamblador es el lenguaje de programación más parecido al que utiliza nuestro procesador, permitiéndonos ejecutar programas en  dicho procesador como nosotros queremos.
Los diferentes lenguajes  compilados ( C,C++, Fortran, etc...) realmente lo que hacen es pasarse a ensamblador para que el compilador pueda ejecutarlos.

Por que usar ensamblador?
El motivo más claro para usar ensamblador es el aumento de rendimiento de nuestras aplicaciones. Al usar las instrucciones de ensamblador como nosotros queremos podemos desarrollar códigos óptimos que realicen tareas varios ordenes de magnitud más rápidas que con lenguajes compilados. Esto es así por que los compiladores (los programas que se encargan de "traducir" código C ,por ejemplo) a ensamblador no son perfectos, ni pueden serlo debido a la alta complejidad de las casuísticas posibles y usan los recursos de nuestro procesador de forma subóptima.

Por que no se usa más el ensamblador?
Si el ensamblador es tan bueno, se hace complicado entender por que no se usa en todos los ámbitos de la programación, la respuesta es sencilla: la complejidad. El código escrito en ensamblador tranquilamente es 10 (o 100 ) veces más largo en extensión de lineas de código que un programa en C, aparte de que es más complejo entenderlo, debugarlo y en general desarrollar sobre este lenguaje directamente.

Como se puede usar el lenguaje ensamblador?
Hay dos maneras básicas de usar el ensamblador, una es usando directamente un programa ensamblador que nos pase nuestro código .asm a .exe o .o o lo que toque (como un compilador de C/C++). La otra manera (que es la única que uso y que explicaré) es mediante ensamblador inline. La mayoria de los compiladores actuales permiten introducir trozos de ensamblador dentro del código C/C++, permitiendo usar el ensamblador solamente para aquellas funcionalidades que realmente comprometen el rendimiento total de la aplicación. Es una manera limpia y bastante mantenible de introducir ensamblador en nuestros programas.

Como introduzco código ensamblador en mis programas de C?
He aquí el gran problema del ensamblador inline, no está estandarizado. Esto quiere decir que cada compilador tiene potestad para hacer un poco lo que quiera. Gcc usa un estandar que no me gusta demasiado(algo malo debería tener :D ) ,  DevCpp lo mediosigue, WatCom (un compilador bastante antiguo) tiene su forma muy particular de decidir que registros se pueden modificar o no y de linkar los parametros de entrada de las funciones con los registros del compilador, pero sin duda, para mi el mejor sistema de ensamblador inline es el MSVC++ (lo podéis encontrar en versión gratuita). Este sistema es el que usaré para todos los ejemplos. Si alguien tiene problemas en su compilador que me lo diga y le buscaremos una solución.

La forma de introducir código ensamblador inline es visual studio (MSVC) es tan tonta como la siguiente (solo es un ejemplo):

Código en C


__asm
{
mov ecx,num
mov edi,destination
mov esi,source

shr ecx,2

rep movsd

leave
ret
}


Código en C

En breve os pasaré una lista con las instrucciones más típicas y empezaremos el curso de ensamblador como tal.

Espero que os guste.


Nos vemos


LordPakusBlog

0 comentarios :

Publicar un comentario

Entradas populares