Ассемблер x86_64: почему SYS_read изменяет регистры ‹r11› и ‹rcx›?

Я писал программу на x86_64 ассемблере yasm которая читает строку из консольного ввода и вдруг понял, что после этих строк:

mov     rax, SYS_read
mov     rdi, STDIN
lea     rsi, byte [char] 
mov     rdx, 1
syscall

значения регистров r11 и rcx изменены. Регистр r11 не является регистром аргументов (согласно соглашению о вызовах). Так почему?

Минимальный пример кода

section .data
SYS_read         equ 0
SYS_exit         equ 60
SUCCESS_EXIT     equ 0
STDIN            equ 0

section .bss
char:            resb 1

section .text
global _start
_start:
    xor    r11, r11
    xor    rcx, rcx

    mov    rax, SYS_read
    mov    rdi, STDIN
    lea    rsi, byte [char]
    mov    rdx, 1
    syscall

end:
    mov    rax, SYS_exit
    mov    rdi, SUCCESS_EXIT
    syscall

Непосредственно перед меткой end метки r11 и rcx имеют следующие значения (сеанс gdb):

 rcx            0x4000d5    4194517
 r11            0x246   582

person LRDPRDX    schedule 19.03.2018    source источник
comment
stackoverflow.com/questions/18024672/   -  person Hans Passant    schedule 19.03.2018
comment
Также этот недавний вопрос со ссылкой на инструкцию syscall в ответе... stackoverflow.com/q/49358425/4271923 ( это в основном то, что вам нужно проверить: felixcloutier.com/x86/SYSCALL.html - изменяет rcx и r11).   -  person Ped7g    schedule 19.03.2018