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
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.
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
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
Comentarios
Publicar un comentario