user: 这段汇编代码用C语言表示是什么样的？

```asm
<key_schedule>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %rdx,-0x88(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  movq   $0x0,-0x60(%rbp)
  jmp    L36
L40:
  movq   $0x0,-0x58(%rbp)
  jmp    L9
L15:
  mov    -0x58(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  mov    -0x58(%rbp),%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x68(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addq   $0x1,-0x58(%rbp)
L9:
  cmpq   $0x3f,-0x58(%rbp)
  jbe    L15
  addq   $0x100,-0x68(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <rotate@plt>
  mov    -0x80(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%r8d
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%edi
  mov    -0x80(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%r9d
  mov    -0x80(%rbp),%rax
  mov    (%rax),%r10d
  lea    -0x30(%rbp),%rax
  lea    0xc(%rax),%rcx
  lea    -0x30(%rbp),%rax
  lea    0x8(%rax),%rdx
  lea    -0x30(%rbp),%rax
  lea    0x4(%rax),%rsi
  lea    -0x30(%rbp),%rax
  push   %r8
  push   %rdi
  mov    %r10d,%r8d
  mov    %rax,%rdi
  call   <present_sbox@plt>
  add    $0x10,%rsp
  mov    -0x30(%rbp),%edx
  mov    -0x80(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x80(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x2c(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x80(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x28(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x80(%rbp),%rax
  lea    0xc(%rax),%rdx
  mov    -0x24(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x60(%rbp),%rax
  lea    0x1(%rax),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <round_constant@plt>
  mov    -0x80(%rbp),%rax
  add    $0xf0,%rax
  mov    (%rax),%ecx
  mov    -0x50(%rbp),%edx
  mov    -0x80(%rbp),%rax
  add    $0xf0,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x80(%rbp),%rax
  add    $0xf4,%rax
  mov    (%rax),%ecx
  mov    -0x4c(%rbp),%edx
  mov    -0x80(%rbp),%rax
  add    $0xf4,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x80(%rbp),%rax
  add    $0xf8,%rax
  mov    (%rax),%ecx
  mov    -0x48(%rbp),%edx
  mov    -0x80(%rbp),%rax
  add    $0xf8,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x80(%rbp),%rax
  add    $0xfc,%rax
  mov    (%rax),%ecx
  mov    -0x44(%rbp),%edx
  mov    -0x80(%rbp),%rax
  add    $0xfc,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x80(%rbp),%rax
  add    $0x100,%rax
  mov    (%rax),%ecx
  mov    -0x40(%rbp),%edx
  mov    -0x80(%rbp),%rax
  add    $0x100,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  addq   $0x1,-0x60(%rbp)
L36:
  mov    -0x60(%rbp),%rax
  cmp    -0x88(%rbp),%rax
  jbe    L40
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L7
  call   <__stack_chk_fail@plt>
L7:
  leave
  ret
```

assistant: ```c
void key_schedule(uint64_t *subkeys, uint64_t *key, const size_t nr) {
  uint64_t *ki = subkeys;
  uint64_t S[8];
  uint64_t rc[5];
  for (size_t i = 0; i <= nr; i++) {
    for (size_t j = 0; j < 64; j++)
      ki[j] = key[j];
    ki += 64;
    rotate(key);
    present_sbox(&S[0], &S[1], &S[2], &S[3], key[0], key[1], key[2], key[3]);
    key[0] = S[0], key[1] = S[1], key[2] = S[2], key[3] = S[3];
    round_constant(rc, i + 1);
    key[80 - 1 - 19] ^= rc[0], key[80 - 1 - 18] ^= rc[1], key[80 - 1 - 17] ^= rc[2];
    key[80 - 1 - 16] ^= rc[3], key[80 - 1 - 15] ^= rc[4];
  }
}
```