NASM Coding: Basics - Program Examples

  1. ; 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