user: 下面的汇编指令对应的C源代码是什么：

```asm
<is_valid>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  add    %eax,%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x2,%eax
  add    %edx,%eax
  lea    (%rax,%rax,1),%ecx
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  add    %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  sub    %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  lea    (%rcx,%rax,1),%edx
  movslq %edx,%rax
  imul   $0x2e8ba2e9,%rax,%rax
  shr    $0x20,%rax
  sar    %eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  add    %ecx,%eax
  sub    %eax,%edx
  mov    %edx,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0xc,-0x4(%rbp)
  jle    L58
  cmpl   $0x14,-0x4(%rbp)
  jle    L70
L58:
  cmpl   $0x20,-0x4(%rbp)
  jle    L93
  cmpl   $0x28,-0x4(%rbp)
  jle    L70
L93:
  cmpl   $0x34,-0x4(%rbp)
  jg     L70
  cmpl   $0x1f,-0x8(%rbp)
  jle    L89
L70:
  mov    $0x0,%eax
  jmp    L80
L89:
  cmpl   $0xa,-0xc(%rbp)
  je     L28
  mov    -0xc(%rbp),%eax
  jmp    L79
L28:
  mov    $0x0,%eax
L79:
  mov    -0x18(%rbp),%rdx
  add    $0x24,%rdx
  mov    (%rdx),%edx
  cmp    %edx,%eax
  je     L101
  mov    $0x0,%eax
  jmp    L80
L101:
  mov    $0x1,%eax
L80:
  pop    %rbp
  ret
```

assistant: ```c
int is_valid(int *egn) {
  int valid_d, valid_m, control;
  control = (egn[0] * 2 + egn[1] * 4 + egn[2] * 8 + egn[3] * 5 + egn[4] * 10 + egn[5] * 9 + egn[6] * 7 + egn[7] * 3 + egn[8] * 6) % 11;
  valid_d = egn[4] * 10 + egn[5];
  valid_m = egn[2] * 10 + egn[3];
  if ((valid_m > 12 && valid_m < 21) || (valid_m > 32 && valid_m < 41) || (valid_m > 52) || (valid_d > 31)) {
    return 0;
  } else if (((control == 10) ? 0 : control) != egn[9]) {
    return 0;
  }
  return 1;
}
```