segment .data
data    db      "hello world", 0
n       dq      0
needle  db      'w'

        segment .text
        global  main
main:
        push    rbp
        mov     rbp, rsp

;       Register usage
;
;       rax: c, byte of data array
;       r8b:  x, byte to search for
;       rcx: i, loop counter, 0-63
;       rdx: data, address of data
;
        mov     r8b, [needle]
        lea     rdx, [data]
;       i = 0;
        xor     ecx, ecx
;       c = data[i];
        mov     al, [rdx+rcx]
;       if ( c != 0 ) {
        cmp     al, 0
        jz      end_if
;           do {
do_while:
;               if ( c == x ) break;
                cmp     al, r8b
                je      found
;               i++;
                inc     rcx
;               c = data[i];
                mov     al, [rdx+rcx];
;           } while ( c != 0 );
            cmp     al, 0
            jnz     do_while
;       }
end_if:
;       n = c == 0 ? -1 : i;
        mov     rcx, -1
found:  mov     [n], rcx
;       return 0;
        xor     eax, eax
        leave
        ret