; A program that takes an input (integer) from the user, and checks if it is even or odd.
; Output example:
; The number you entered is:
; 8
; and it is even.
section .data
even_msg db "and it is even.", 10
even_len equ $ - even_msg
odd_msg db "and it is odd.", 10
odd_len equ $ - odd_msg
newline db 10
msg db "The number you entered is: ", 10
msg_len equ $ - msg
section .bss
buffer resb 16 ; Create char buffer [16]
section .text
global _start
_start:
; --- read input ---
mov rax, 0 ; syscall: read
mov rdi, 0 ; stdin
mov rsi, buffer ; store input here
mov rdx, 16 ; max bytes
syscall
; --- Printing the entered number ---
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
mov rax, 1
mov rdi, 1
mov rsi, buffer
mov rdx, 16
syscall
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; --- convert ASCII to integer ---
mov rsi, buffer ; pointer to input
xor rax, rax ; result = 0
convert_loop:
movzx rbx, byte [rsi] ; load current char
cmp bl, 10 ; newline?
je conversion_done
cmp bl, 0 ; null terminator?
je conversion_done
sub rbx, '0' ; ASCII -> digit (e.g., '5' -> 5)
imul rax, 10 ; result *= 10
add rax, rbx ; result += digit
inc rsi ; move to next char
jmp convert_loop
conversion_done:
; --- check even/odd ---
test rax, 1 ; check lowest bit
; If the lowest bit it 1, the number is odd
; If the lowest bit it 0, the number is even
jz is_even ; if zero, then even
is_odd:
mov rax, 1
mov rdi, 1
mov rsi, odd_msg
mov rdx, odd_len
syscall
jmp exit
is_even:
mov rax, 1
mov rdi, 1
mov rsi, even_msg
mov rdx, even_len
syscall
exit:
mov rax, 60
mov rdi, 0
syscall