jueves, 27 de septiembre de 2007

Manual de Ensamblador x86 parte I - Herramientas

Dando continuidad a esta serie de post sobre el lenguaje ensamblador, ahora veremos las partes que conforman el codigo de un programa en ensamblador.

Bien, lo primero que debe haber en el codigo son las directivas, en estas se hace la declaracion de las variables de datos que utilizaremos y el codigo que contendra los registros, existen 3 tipos de directivas para este lenguaje, una de ellas es obligatoria, mientras que dos son opcionales, estas directivas llevan por nombre:

  • data - opcional
  • bss - opcional
  • text - obligatoria


Directiva data
En esta directiva se hace la declaracion de los elementos que utilizaremos a lo largo de nuestro programa, y que sean declarados con un valor inicial, el nombre de la variable, el tipo de dato y el dato que contendra, por ejemplo:

.section .data
entero:
.int 10



Se puede apreciar en el ejemplo anterior la palabra section y los puntos que proceden a las palabras, bien, la palabra section es utilizada para la declaracion de una directiva, y especificando que directiva es, los puntos al inicio son parte de la sintaxis que se utiliza en las directivas.

En esta directiva se pueden declarar variables de los siguientes tipos:

.ascii = cadena de texto
.asciz = cadena de texto con terminacion nula
.byte = valor de byte
.double = numero de punto flotante de doble precision
.float = numero de punto flotante de precision simple
.int = numero entero de 32 bits
.long = numero entero de 32 bits (mismo que .int)
.octa = numero entero de 16 bytes
.quad = numero entero de 8 bytes
.short = numero entero de 16 bits
.single = numero de punto flotante de precision simple (mismo que .float)
.que = constante

Ejemplo:


.section .data
frase:
.ascii "Hello world"
pi:
.float 3.14159
numeros:
.long 100,150,200,500
alto:
.int 10
factores:
.double 37.45, 45.33, 12.30
palabras:
.asciz "Hello '%s'\n"



Estos tipos de datos pueden ser utilizados en la directiva bss, algunos tipos como .asciz no es importante aprenderlo ahora ya que sera explicado mas adelante en el proceso de compilacion dinamica para utilizar librerias de C con instrucciones de ensamblador.


Directiva bss
En esta parte es donde se declaran los elementos que seran inicializados con un 0, o con valor nulo, en estos tipos de datos es mas comun la declaracion de arrays que se mantendran en areas del buffer que seran utilizadas a lo largo del programa.

Ejemplo:

.section .bss
.lcomm buffer, 12


En ese ejemplo se declara un array con 12 bytes del area del buffer de memoria, como bien se sabe los arrays en su mayoria son utilizados para guardar datos no declarados previamente, es por eso que se utiliza la directiva .lcomm en la seccion bss.


Directiva text
En esta directiva es donde se ubicaran todas las instrucciones del programa, es decir es la parte fundamental del programa, ya que es aqui donde estaran todas las instrucciones en el lenguaje ensamblador.

.section .text
.globl _start
_start:

En ocasiones se hace necesario el uso de una plantilla para utilizarla en todos nuestros programas, en ella deben de estar todas las directivas, asi como los principales registros que utilizaremos.

.section .data
; Variables declaradas con un valor inicial
.section .bss
; Variables declaradas sin valor o nulo
.section .text
.globl _start
_start:
; Instrucciones del programa

La directiva .globl es utilizada sobre la etiqueta _start para que el codigo pueda ser utilizado desde otra aplicacion en forma global, si en dado caso se cambia la etiqueta es necesario especificarla en la compilacion del codigo, que sera mostrado en el siguiente post donde ya se vera el uso de registros y mas sobre el lenguaje ensamblador.

Por ahora es todo.

Saludos.

3 comentarios :

  1. Acido 69 dijo...

    muy bien. esperare el siguiente con ganas :P
    thx

  2. Miguel dijo...

    Eso espero si no me voy a sentir muy solo escribiendo esto.. :P

  3. sonyx_32 dijo...

    No te preocupes yo tambien te leo... x)