Saltos en Ensamblador X86

Josué Acevedo Maldonado
Nabucodonosor Editorial
4 min readMay 4, 2020

Una alternativa a los if’s.

Los saltos permiten alterar la ejecución secuencial de un programa, al hacer que la instrucción próxima a ejecutarse pase de ser una que se encuentra en una ubicación de memoria contigua, a una ubicada justo después de una etiqueta de código. Un salto se puede realizar a cualquiera de las etiquetas de código creadas por el programador, las cuales en el proceso de ensamblaje serán remplazadas por las direcciones de memoria de código donde estás se ubican.

Tradicionalmente han existido tres tipos de saltos, aunque en los ensambladores modernos como NASM el tipo de salto a utilizar se determina automáticamente y no es necesario colocarlo de forma explícita.

SHORT Este salto solo permite desplazarse 128 bytes en la memoria hacia cualquier dirección, ya que utiliza un byte con signo para almacenar el tamaño del salto.

NEAR Este es el tipo de salto predefinido, permite moverse a lo largo del segmento de código
para lo cual utiliza cuatro bytes para almacenar el valor del salto.

FAR Este tipo de salto es muy raro, ya que permite ir de un segmento a otro de código.

Saltos incondicionales

JMP (Jump, Salto) es una instrucción del juego de instrucciones x86 la cual permite realizar saltos de forma automática, sin evaluar ningún tipo de condición, a una etiqueta de código que recibe como argumento.

JMP etiqueta

Saltos condicionales

Los saltos condicionales también reciben una etiqueta como operando, pero a diferencia de los incondicionales estos leen el estado de los bit’s del registro de banderas y dependiendo de los valores presentes en ellos se evalúa si se realiza el salto o no.

Existen tres grupos de saltos condicionales, si los datos previamente comparados con la instrucción CMP presentan signo o no, las banderas afectadas serán distintas por lo que es que existen instrucciones de salto que verifican los estados de distintas banderas para las mismas comparaciones, de ahí los dos primeros grupos; adicional a estos existen también saltos que comprueban el valor de una sola bandera o registro, que tienen un uso más específico.

segment .data
mensaje_division db 0xA,0xD,"la division de 8/2 es: "
len_division equ $- mensaje_division
mensaje_cero db 0xA,0xD,"ecx es cero", 0xA,0xD
len_cero equ $- mensaje_cero
fin db 0xA,0xD,"---------------<>---------------", 0xA,0xD
len_fin equ $- fin
segment .bss
res resb 1
section .text
global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, mensaje_division
mov edx, len_division
int 0x80
mov eax, 8 ; se almacena en el registro eax el valor ocho
mov edx, 0 ; se almacena en el registro edx el valor cero
mov ecx, 2 ; se almacena en el registro ecx el valor dos
cmp ecx, 0 ; compara el valor almacenado en el registro
; ecx con el número cero
je escero ; si el valor almacenado en el registro ecx
; es igual cero, entonces el programa salta
; a la etiqueta 'escero'
div ecx ; de no ser asi, el salto no se realiza y se
; ejecuta la instruccion de division
add eax, '0'
mov [res], eax
mov eax, 4
mov ebx, 1
mov ecx, res
mov edx, 1
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, fin
mov edx, len_fin
int 0x80
jmp salir ; salta automaticamente a la etiqueta
; 'salir' para no ejecutar las
; instrucciones que se encuentran delante
; de la etiqueta 'escero'
escero: ; este bloque de codigo imprime
mov eax, 4 ; un mensaje en caso de que ecx
mov ebx, 1 ; sea igual a cero
mov ecx, mensaje_cero
mov edx, len_cero
int 0x80
salir:
mov eax, 1
mov ebx, 0
int 0x80
/code # ./saltos
la division de 8/2 es: 4
---------------<>---------------
/code #

Al modificar la instrucción mov ecx, 2 del programa anterior por mov ecx, 0, se obtendrá la siguiente salida en pantalla:

/code # ./saltos
la division de 8/2 es:
ecx es cero
/code #

Josue Acevedo Maldonado es ingeniero de software, trabaja actualmente como consultor.

Conectarse en LinkedIn.

¡Gracias por ser parte de la comunidad!
Puede encontrar contenido relacionado en el canal de YouTube, Twitter, Twitch, Spotify, etc, ademas del libro Ensamblador X86.

Si ha disfrutado de este artículo y siente que ha aprendido algo valioso, por favor compártalo.

¡Gracias por leer!

--

--

Josué Acevedo Maldonado
Nabucodonosor Editorial

Amante de la tecnologia y con pasion en resolver problemas interesantes, consultor, y creador del canal de youtube NEOMATRIX. https://linktr.ee/neomatrix