 
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
  section .text
   global _start            ; должно быть объявлено для использования gcc
	
_start:                     ; сообщаем линкеру входную точку
   mov   ax,   8h           ; записываем 8 в регистр AX 
   and   ax, 1              ; выполняем операцию AND с AX
   jz    evnn
   mov   eax, 4             ; номер системного вызова (sys_write)
   mov   ebx, 1             ; файловый дескриптор (stdout)
   mov   ecx, odd_msg       ; сообщение для написания
   mov   edx, len2          ; длина сообщения
   int   0x80               ; вызов ядра
   jmp   outprog
 
evnn:   
  
   mov   ah,  09h
   mov   eax, 4             ; номер системного вызова (sys_write)
   mov   ebx, 1             ; файловый дескриптор (stdout)
   mov   ecx, even_msg      ; сообщение для написания
   mov   edx, len1          ; длина сообщения
   int   0x80               ; вызов ядра
 
outprog:
 
   mov   eax,1              ; номер системного вызова (sys_exit)
   int   0x80               ; вызов ядра
 
section   .data
even_msg  db  'Even Number!' ; сообщение с чётным числом
len1  equ  $ - even_msg 
   
odd_msg db  'Odd Number!'    ; сообщение с нечётным числом
len2  equ  $ - odd_msg 
  
   
  
   
  
  
До кучи если хочется низкоуровневого попробуйте, море впечатлений гарантирую.
Статья обзорная, но понять можно
https://www.hwp.ru/articles/Smart_nic_explain_151737/
Это более интересная
https://habr.com/ru/post/267183/