miércoles, 25 de agosto de 2010

Uso básico de la pila Gnu Assembler (GAS)


Uno de los elementos clave en el proceso de aprender a programar en ensamblador es el uso de la pila, de forma típica la pila se utiliza en el paso de parámetros a métodos, pero también se acostumbra usar para guardar valores de registros, es decir, si un registro se usa en un método, el valor anterior del registro puede ser preservado, también para guardar por ejemplo los bits de estado para que una llamada a un método no afecte el estado, en este ejemplo se crea un procedimiento que preserva los valores de los registros que utiliza, y se demuestra guardando un valor en el registro antes de una llamada y luego usando un salto para omitir el segundo mensaje.



.text

.global _start

_start: 

# write msg

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

    movl $100 , %eax  # guardar 100 en eax

    call PrintMsg

    cmpl $100 , %eax  # comparar 100 con eax

    je salir      # si eax es igual a 100 , salir


# write msg1

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

salir:  

# 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 #
# deja intactos los registros que utiliza #
###########################################


PrintMsg: 

    pushl %eax    #guardar el contenido de eax en la pila
    pushl %ebx    #guardar el contenido de ebx en la pila

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

    int $0x80

    popl %ebx    #restaurar el valor de ebx 
    popl %eax    #testaurar el valor de eax

    ret    #return

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

.data 

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

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



Descargar Codigo Fuente

los comandos para ensamblar , enlazar y ejecutar este ejemplo son

as -o hola4.o hola4.asm
ld -o hola4 hola4.o
./hola4