rep - repeat string operations

repeat a string operation rcx times OR
repeat a string operation while a condition is true a mximum of rcx times

The various repeat instructions all involve using the rcx to control the count of the number of times to execute the following string instruction. The simplest variety, rep, repeats the string instruction exactly rcs times. The next variety, repe (or repz), is limited to rcx times but also continues with the loop only if certain values are equal. The values tested depend on the specific string instruction used. The last variety, repne (or repnz), is limited to rcx times but also continues with the loop only if certain values are not equal.

        lea     rdi, [dest]         ; get the address of the destination array
        lea     rsi, [source]       ; get the address of the source array
        cld                         ; clear the direction flag to increment
        mov     ecx, 1000           ; count = 1000
        rep     movsq               ; move 1000 quadwords from source to dest
                                    ; rdi and rsi increment by 8 each time

        lea     rdi, [source]       ; get the address of the array
        cld                         ; clear the direction flag to increment
        mov     ecx, -1             ; count is pretty big
        xor     al, al              ; will scan for 0 byte
        repne   scasb               ; scan forward at most a lot
                                    ; rdi increments by 1 each time
                                    ; repeats while the byte scanned is != al
        mov     eax, -2             ; we start at -1 end up 1 past the end
        sub     eax, ecx            ; yields the length of a C string
        ; Consider a string of length 0.
        ; The first iteration of the repeat finds the 0 byte.
        ; This means ecx == -2 and subtracting -2 - -2 = 0

        ; Consider a string of length 1.
        ; The second iteration of the repeat finds the 0 byte.
        ; This means ecx == -3 and -2 - -3 = 1.

flags: none