If you want to use your routines called from C functions, you need to obey the calling SysV ABI convention (since you are dealing with ELF). In amd64 code the first 6 "integer" arguments (including pointers) are passed through registers: RDI, RSI, RDX, RCX, R8 and R9. If you use floating point arguments, the 7 first are passed through XMM0-XMM7.
So, your slen funcion should be:
; size_t slen( char *s );
slen:
xor eax,eax ; EAX is used as counter.
.loop:
cmp byte [rdi],0
jz .exit
add rax,1
add rdi,1
jmp .loop
.exit:
ret
Yet, syscalls called though 'int 0x80' lacks support for 64 bits pointers. You should use 'syscall' instruction (with different function id for write()):
sprint:
mov rsi, rdi ; save RDI on RSI (RSI used by write syscall).
call slen
mov rdx, rax ; RDX is the string length.
mov eax, 1 ; write syscall
mov edi, eax ; stdout
syscall
ret
sprintF:
call sprint
mov eax,1
mov edx,eax
mov edi,eax
lea rsi,[lf]
syscall
ret
lf: db `\n`
OBS: When you change an E?? register, the upper 32 bits of R?? register is zeroed, autmatically.