Jump Statements

Jump statements are used to skip over a part of code by sending the instruction pointer to a different location. We can jump to some defined label using jmp.
cmp is used to compare two values, which can be used in conditional jumps. Conditional jumps are performed by using following keywords -
je A, B ; JUMP if equal
jne A, B ; JUMP if not equal
jg A, B ; JUMP if greater
jge A, B ; JUMP if greater or equal
jl A, B ; JUMP if less
jle A, B ; JUMP if less or equal
Let us do an example to compare two numbers to further understand jump statements.
Make an assembly file called jump.asm and follow along -

                                    

global _start ; must be declared for linker

section .data

first_prompt db "Enter the first number " ; first_prompt="Enter the first number "

len_first_prompt equ $ - first_prompt ; len_first_prompt equals size of first_prompt

second_prompt db "Enter the second number " ; second_prompt="Enter the second number "

len_second_prompt equ $ - second_prompt ; len_second_prompt equals size of second_prompt

greater_prompt db "is greater" ; greater_prompt="is greater"

len_greater_prompt equ $ - greater_prompt ; len_greater_prompt equals size of greater_prompt

equal_prompt db "Numbers are equal" ; equal_prompt="Numbers are equal"

len_equal_prompt equ $ - equal_prompt ; len_equal_prompt equals size of equal_prompt

section .bss

first resb 5 ; Unitialized data variable first

second resb 5 ; Unitialized data variable second

section .text

_start: ; start label

mov eax, 4 ; sys_write system call

mov ebx, 1 ; stdout file descriptor

mov ecx, first_prompt ; ecx=first_prompt

mov edx, len_first_prompt ; edx=len_first_prompt

int 0x80 ; Calling interrupt handler

mov eax, 3 ; sys_read system call

mov ebx, 2 ; stdin file descriptor

mov ecx, first ; Read first input value in first

mov edx, 5 ; 5 bytes (numeric, 1 for sign) of that data value

int 0x80 ; Calling interrupt handler

mov eax, 4 ; sys_write system call

mov ebx, 1 ; stdout file descriptor

mov ecx, second_prompt ; ecx=second_prompt

mov edx, len_second_prompt ; edx=len_second_prompt

int 0x80 ; Calling interrupt handler

mov eax, 3 ; sys_read system call

mov ebx, 2 ; stdin file descriptor

mov ecx, second ; Read second input value in second

mov edx, 5 ; 2 bytes (numeric, 1 for sign) of that data value

int 0x80 ; Calling interrupt handler

mov eax, [first] ; eax equal to value of first

mov ebx, [second] ; ebx equal to value of second

cmp eax, ebx ; Comparing and storing result in flag register

jl lessthan ; Jump to label less than if reult is less

jg greaterthan ; Jump to label greater than if reult is greater

mov eax, 4 ; sys_write system call if numbers are equal

mov ebx, 1 ; stdout file descriptor

mov ecx, equal_prompt ; ecx=equal_prompt

mov edx, len_equal_prompt ; edx=len_equal_prompt

int 0x80 ; Calling interrupt handler

jmp exit ; Jump to exit label

lessthan: ; less than label

mov eax, 4 ; sys_write system call

mov ebx, 1 ; stdout file descriptor

mov ecx, second ; ecx=second

mov edx, 5 ; 5 bytes for number

int 0x80 ; Calling interrupt handler

mov eax, 4 ; sys_write system call

mov ebx, 1 ; stdout file descriptor

mov ecx, greater_prompt ; ecx=greater_prompt

mov edx, len_greater_prompt ; edx=len_greater_prompt

int 0x80 ; Calling interrupt handler

jmp exit ; Jump to exit label

greaterthan: ; greater than label

mov eax, 4 ; sys_write system call

mov ebx, 1 ; stdout file descriptor

mov ecx, first ; ecx=first

mov edx, 5 ; 5 bytes for number

int 0x80 ; Calling interrupt handler

mov eax, 4 ; sys_write system call

mov ebx, 1 ; stdout file descriptor

mov ecx, greater_prompt ; ecx=greater_prompt

mov edx, len_greater_prompt ; edx=len_greater_prompt

int 0x80 ; Calling interrupt handler

jmp exit ; Jump to exit label

exit: ; exit label

mov eax , 1 ; sys_exit system call

mov ebx , 0 ; setting exit status

int 0x80 ; Calling interrupt handler to exit program


                                    

>> nasm -f elf32 flag.asm -o flag.o

>> ld -m elf_i386 flag.o -o flag

>> ./flag


                                   

>> Enter the first number 15

>> Enter the second number 23

>> 23

>> is greater


>> Enter the first number 3

>> Enter the second number 3

>> Numbers are equal


Now let us expand our knowledge of operations and jump statement to find factorial of a number.