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 usingjmp
.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 jne
A, B jg
A, B jge
A, B jl
A, B jle
A, B 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.