domingo, 1 de agosto de 2010

Salto Incondicional JMP en Gnu Assembler (GAS)


Los saltos son la forma básica de control de flujo en lenguaje ensamblador, un salto acompañado de una etiqueta de destino, nos permite llevar al procesador a ejecutar en cualquier región de nuestro código.

en este ejemplo, veremos la forma mas básica de salto, el salto incondicional, el cual modifica el flujo del programa, y lo dirige hacia una etiqueta definida.

como primer paso para entender la forma en la que actúa una instrucción "jmp", vamos a usar un pequeño ejemplo, que imprime dos mensajes en pantalla, uno después de otro en una secuencia simple

.text

.global _start

_start: 

# write msg

    movl    $len, %edx
    movl     $msg, %ecx
    movl    $1, %ebx
    movl     $4, %eax

    int $0x80

# write msg1

    movl    $len1, %edx
    movl     $msg1, %ecx
    movl    $1, %ebx
    movl     $4, %eax

    int $0x80

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

.data 

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

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

Ahora vamos a incluir una instrucción "jmp" y la definición de una etiqueta justo antes de la impresión del segundo mensaje, esto nos permitirá omitir el código que imprime el primer mensaje, forzando al procesador a no ejecutar dichas instrucciones, para esto sirve un salto incondicional.


.text

.global _start

_start: 

# salto incondicional 

    jmp Mensaje    # ir al punto marcado por la etiqueta Mensaje
# write msg

    movl    $len, %edx
    movl     $msg, %ecx
    movl    $1, %ebx
    movl     $4, %eax

    int $0x80

# write msg1

Mensaje: 

    movl    $len1, %edx
    movl     $msg1, %ecx
    movl    $1, %ebx
    movl     $4, %eax

    int $0x80

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

.data 

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

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



como resultado de la ejecucion de cada uno de estos programas tendremos
primer caso

hola mundo!
mensaje 2!

y en el segundo caso gracias al uso de "jmp"

mensaje 2!

Descargar Código fuente

Para ensamblar y enlazar estos archivos de código fuente, se deben utilizar los siguientes comandos, en un entorno Gnu/Linux que tenga instalado el paquete Binutils

as -o archivo.o archivo.asm
ld -o nombreEjecutable archivo.o


por ejemplo para generar el ejecutable hola1

as -o hola1.o hola1.asm
ld -o hola1 hola1.o

y ejecutar con ./hola1