lunes, 1 de octubre de 2007

El lenguaje ensamblador es un lenguaje de tipo lineal y solo es posible modificar su ejecucion mediante instruccines especiales de salto, en su defecto utilizando funciones, la sintaxis de este lenguaje no es dificil de aprender, aunque existen diferentes versiones de la sintaxis para este en lenguaje en plataformas x86, a lo largo de este manual estaremos usando la sintaxis de AT&T, ?porque esta sintaxis y no la de Intel?, pues porque es mas facil de aprender, seguir y de gestionar que la de intel, sin mencionar que la desarrollo la compania que realizo el OS UNIX en completo asm, por lo tanto es la sintaxis mas apropiada para nuestro sistema GNU/Linux.

Aunque de igual forma se puede usar la sintaxis de Intel, de todas formas aqui les mostrare las principales diferencias entre las sintaxis de Intel y AT&T, de esta forma podran leer ambas sintaxis sin ningun problema y ya veran que no hay grandes diferencias.

Una de las partes mas confusas de el GNU assembler (as) es precisamente la sintaxis, es usada para la representacion del codigo en ensamblador en el archivo del codigo fuente. Los desarrolladores originales del as implementaron la sintaxis de AT&T para el assembler.

La sintaxis de AT&T originada de AT&T Bell Labs, donde el sistema operativo UNIX fue creado. Es formada basandose en el opcode del chip del procesador mas popular y usado para implementar el sistema operativo UNIX en ese tiempo. Mientras que algunas empresas de procesadores usaban este formato, desafortunadamente Intel empieza a usar un opcode diferente.

Porque digo esto, usando as para programas en lenguaje ensamblador para la plataforma Intel puede ser laborioso. Mas documentacion sobre la programacion en lenguaje ensamblador con el opcode de Intel es usada actualmente, mientas que hay mas documentacion escrita para la programacion en las viejos sistemas UNIX usando la sintaxis de AT&T, esto puede causar confusiones y trabajo extra para los programadores de GNU assembler.

Mas de las principales diferencias en instrucciones de formato especificas, todas estas reglas de sintaxis seran utilizadas a lo largo de los proximos capitulos.

Las principales diferencias de la sintaxis de Intel y AT&T son:

  1. AT&T usa operandos para denotar las variables ($), mientras que en la sintaxis de intel no son necesarios, es decir, para utilizar un numero entero decimal es necesario ubicar el signo de dollar antes del valor $10 , mientras que en Intel solo es necesario ubicar el numero 10.
    ejemplo:
    movl $10, %eax ;reubica el numero 10 decimal en el registro EAX

  2. AT&T utiliza el simbolo de porcentaje para referenciar a los registros (%), mientras que intel no los utiliza, pero si hay que especificarlos con mayusculas, para facilitar su lectura.
    ejemplo:
    movl $10, %eax ; AT&t
    MOV EAX, 10 ;intel

  3. La sintaxis de AT&T utiliza la forma [inicio]>[destino], mientras que Intel lo utiliza de forma inversa [destino]<[inicio].
    Mismo ejemplo de arriva:
    MOVER [INICIO]>[DESTINO] AT&T
    movl $10, %eax
    MOVER [DESTINO]<[INICIO] INTEL
    MOV EAX, 10

  4. AT&T usa un caracter especial al final de la instruccion para referenciar el tamano usado en la operacion, mientras que en la sintaxis de Intel el tamano es declado por un operador por separado.
    Ejemplo:
    movl $var, %eax ; reubica 32 bits de la variable var al registro EAX, l = 32 bits
    MOV EAX, dword ptr var ;reubica 32 bits de la variable var al registro EAX

  5. Los saltos y llamadas a etiquetas usan una sintaxis diferente para definir los valores del segmento y offset. AT&T usa:ljmp $section, $offsetIntel:jmp section:offset

Mientras las diferencias pueden hacer dificil la decision de aprender los dos formatos, si tu te decides por uno o por otro esta bien, si aprendes a codear en lenguaje ensamblador usando la sintaxis de AT&T, tu puedes estar muy comodo creando programas en lenguaje ensamblador en muchos sistemas UNIX disponibles, y en mas hardware disponible. Si tu plan es cruzar plataformas y trabajar con sistemas UNIX y Microsoft Windows, tu puedes considerar la idea de utilizar la sintaxis de Intel en tus aplicaciones.

El GNU Assembler provee de un metodo para usar la sintaxis de Intel en lugar de la sintaxis de AT&T, pero en el tiempo de que escribo esto aun no esta bien documentado y puede pasar sucesos inesperados. La directiva .intel_syntax en un programa de lenguaje ensamblador llamado as para ensamblar las instrucciones de codigo usando la sintaxis de intel en lugar de la de AT&t. Desafortunadamente, esta directiva mantiene numerosas limitaciones a este metodo.

Por ejemplo, los eventos de las ordenes de inicio y destino para la sintaxis de Intel, tu necesitas usar un prefijo para los nombres de los registros con el signo de porcentaje (como en la sintaxis de AT&T). Esperemos que en una futura version de as pueda interpretar a full la sintaxis de Intel en codigo ensamblador.

La parte de la sintaxis es un tema muy basico debido a que conforme se vayan acostumbrando al lenguaje veran que la sintaxis es relativa al codigo del programa, pero obviamente no la podia dejar pasar por alto, en el proximo post veremos las instrucciones que tiene este hermoso lenguaje, pero desde ahora les advierto que son muchas y muy dificil aprenderselas todas completas, pero no exijo mucho, al menos no, mientras no veamos registros que sera despues de las instrucciones..xD, guarden un poco de cerebro que lo van a necesitar de reserva.

Nos vemos en instrucciones.

0 comentarios :