X86_64 implementation of STRCHR using NASM
Bug #1
You set the DF flag, so your string operation is going to run backwards.  You should clear the DF flag to scan your string in the forwards direction.
Bug #2
If you reach the byte limit, your function will return the original string pointer in RAX.  The comment says it should return NULL.  Perhaps you meant xor rax, rax instead of mov rax, rdi?
Bug #3
According to the comments, your function should return with ZF set according to the result of the scan.  However, since you do pushf and then popf, the ZF result is wiped out by the popf.
Your own ABI
I would suggest following the standard X64 ABI rather than inventing a new ABI per function.  For one thing, you will be able to use high level languages to interface with your assembly routines.  Another thing is that it would be hard for you to remember details such as &quot;when I call strlen, ZF set means that the terminating character was found&quot;.
Don't call it strlen
Your function is closer to strchr or strnchr than strlen.  Any reasonable person would expect a function called strlen to return a length rather than a pointer.