miércoles, 11 de agosto de 2010

Procedimientos en Ensamblador Gnu Assembler (GAS)


Los procedimientos o subrutinas son una forma básica para reutilizar código, y ademas una forma simple de abstracción que nos permite crear secuencias de acciones que tienen como fin llevar a cabo una tarea, que puede ser útil en diferentes contextos, por lo que se requiere invocar dicho grupo de instrucciones, y regresar al punto desde donde fueron invocadas, normalmente se hacen versiones generales de alguna tarea, que recibe ciertos parámetros para personalizar su comportamiento, en este ejemplo vamos a crear un procedimiento simple que permite imprimir un mensaje en pantalla usando la llamada del sistema "write" , sin tener que repetir las instrucciones para invocar la interrupción 0x80. un procedimiento se define como una etiqueta normal, pero tiene la característica de que cuenta con una instrucción "ret" al final del cuerpo del procedimiento para indicar que se regrese el control al punto desde donde se invoca, y ademas para llamar un procedimiento se debe usar la instrucción "call" y no un simple salto

.text

.global _start

_start: 

# write msg

    movl    $len, %edx
    movl     $msg, %ecx
    
#invocar el procedimiento
    
    call PrintMsg

    call PrintMsg


# write msg1

    movl    $len1, %edx
    movl     $msg1, %ecx
    
    call PrintMsg

# exit
    movl    $0, %ebx
    movl     $1, %eax
    
    int $0x80


########################################### 
# procedimiento PrintMsg          #
# recibe en %edx el tamaño de la cadena   # 
# recibe en %ecx el apuntador a la cadena #
###########################################


PrintMsg: 

    movl    $1, %ebx
    movl     $4, %eax

    int $0x80

    ret    #return

#########################################

.data 

    msg: .ascii "hola mundo!\n"
    len = 12

    msg1: .ascii "mensaje 2!\n"
    len1 = 11


Descargar Código fuente

para ensamblar este ejemplo es necesario contar con un sistema Gnu/Linux que tenga instalado el paquete binutils para poder usar el ensamblador gnu ( as ) y el linker ( ld )

los comandos para ensamblar , enlazar y ejecutar este ejemplo son

as -o hola3.o hola3.asm
ld -o hola3 hola3.o
./hola3

la salida debe ser

hola mundo!
hola mundo!
mensaje 2!