アセンブラを独学中です。大学で情報をやっているわけでもないのであまり専門用語を使う際は簡単な説明を入れてもらえると助かります。

Hello, worldを10回表示させるプログラムを書きましたが
rcxをsyscallの前後でスタックから出し入れする必要がありました。これはなぜでしょうか?

global _main
section .text
_main:
    mov rcx, 10

loop_label:
    mov     rax, 0x2000004
    mov     rdi, 1
    mov     rsi, msg
    mov     rdx, msg.len

    push rcx       ; to avoid register rcx from changing
    syscall
    pop rcx        ; to avoid register rcx from changing

    ; inc rcx
    cmp rcx, 10
    loop loop_label

    mov     rax, 0x2000001
    mov     rdi, 0
    syscall


section .data
msg:    db      "Hello, world!", 10
.len:   equ     $ - msg