%macro scall 4 ;general macro with 4 parameters
 mov rax,%1 ;read syscall
 mov rdi,%2 ;keyboard
 mov rsi,%3 ;variable
 mov rdx,%4 ;variable lenght in bytes
 syscall ;call the kernel
%endmacro

section .data
 menu db 10d,13d,"--Menu--"
 db 10d,"1.ENTER A STRING"
 db 10d,"2.LENGTH OF STRING"
 db 10d,"3.REVERSE STRING"
 db 10d,"4.CHECK STRING IS PALLINDROME OR NOT"
 db 10d,"5.EXIT"
 db 10d,"ENTER YOUR CHOICE:"
	
 menulen equ $-menu

 newline db 10

 m1 db 10d,"ENTER STRING:"
 l1 equ $-m1

 m2 db 10d,"LENGTH OF STRING:"
 l2 equ $-m2

 m3 db 10d,"REVERSE STRING:"
 l3 equ $-m3

 m4 db 10d,"STRING IS PALLINDROME!!"
 l4 equ $-m4

 m5 db 10d,"STRING IS NOT PALINDROME!!"
 l5 equ $-m5

 m6 db 10d,"!!!!!STRING OPERATION COMPLETED!!!!!"
 l6 equ $-m6

section .bss
 string resb 50
 string2 resb 50
 len resb 16
 choice resb 16
 answer resb 16

section .text
 global _start
 _start:
  scall 1,1,menu,menulen
  scall 0,0,choice,2
  cmp byte[choice], '1'
  je enter_string
  cmp byte[choice], '2'
  je display_length
  cmp byte[choice], '3'
  je string_reverse
  cmp byte[choice], '4'
  je pallindrome
  cmp byte[choice], '5'
  je exitcall
  
 enter_string:
  scall 1,1,m1,l1
  scall 0,0,string,50
  mov [len],rax  
  scall 1,1,newline,1
  jmp _start
  
 display_length:
  scall 1,1,m2,l2
  mov rax,[len]
  call display
  jmp _start
    
    string_reverse:
  call stringreverse
  scall 1,1,m3,l3
  scall 1,1,string2,[len]
  scall 1,1,newline,1  
  jmp _start
	
 pallindrome:
  mov rsi,string
  mov rdi,string2
  mov rcx,[len]
  call loop3
  jmp _start
	
 exitcall: 
     call exit

loop3:
 mov al,[rsi]
 cmp al,[rdi]
 jne skip2

 inc rsi
 inc rdi
 dec byte[len]
 jnz loop3
 scall 1,1,m4,l4
 scall 1,1,newline,1

exit:
 scall 1,1,m6,l6
 mov rax,60
 mov rdi,0
 syscall

skip2:
 scall 1,1,m5,l5
 scall 1,1,newline,1

display:
 mov rsi,answer+15
 mov rcx,16

loop1:
 mov rdx,0
 mov rbx,16
 div rbx
 cmp dl,09h
 jbe skip1

 add dl,07h

skip1:
 add dl,30H
 mov [rsi],dl
	
 dec rsi
 dec rcx
 jnz loop1
 scall 1,1,answer,16
 scall 1,1,newline,1
ret

stringreverse:
 mov rsi,string
 mov rdi,string2
 mov rcx,[len]
 dec rcx 
 add rdi,rcx

loop2:
 mov al,[rsi]
 mov [rdi],al
 dec rdi
 inc rsi
 loop loop2
ret

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: