user: 请从给定的汇编指令推导出C源代码:

```asm
<date_tester>:
  endbr64
  push   %r15
  mov    $0x1323ed5,%edi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    $0x1323ed5,%ebp
  push   %rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x132664a,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x1328dbf,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x132b534,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x132dca9,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x133067c,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x1324385,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1324340,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1326a50,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x132dace,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13240e7,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13242db,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x132401f,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1359c47,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x5f5bd93,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x3936393,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1326665,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x1328d75,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x132b485,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x132db95,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13302a5,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x15ef4a5,%edi
  call   <is_valid_date@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x16e36e5,%edi
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x13240d3,%edi
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13240d4,%edi
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  cmp    $0x2,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13240d2,%edi
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  test   %eax,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13240d5,%edi
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  cmp    $0x3,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13265e5,%edi
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  cmp    $0x2,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1326665,%edi
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  cmp    $0x5,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x13265fd,%edi
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  cmp    $0x5,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x132433f,%edi
  call   <add_a_day@plt>
  xor    %edi,%edi
  cmp    $0x13265e5,%rax
  sete   %dil
  call   <assert@plt>
  mov    $0x13265e5,%edi
  call   <subtract_a_day@plt>
  xor    %edi,%edi
  cmp    $0x132433f,%rax
  sete   %dil
  call   <assert@plt>
  nop
L6:
  mov    %rbp,%rdi
  call   <add_a_day@plt>
  mov    %rax,%rdi
  call   <subtract_a_day@plt>
  xor    %edi,%edi
  cmp    %rbp,%rax
  sete   %dil
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <add_a_day@plt>
  mov    %rax,%rbp
  cmp    $0x16e13bd,%rax
  jle    L6
  mov    $0x5e7b095,%ebp
  cs nopw 0x0(%rax,%rax,1)
L45:
  mov    %rbp,%rdi
  call   <subtract_a_day@plt>
  mov    %rax,%rdi
  call   <add_a_day@plt>
  xor    %edi,%edi
  cmp    %rbp,%rax
  sete   %dil
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <add_a_day@plt>
  mov    %rax,%rbp
  cmp    $0x5f5bebd,%rax
  jle    L45
  mov    $0xb2b60,%ebx
  mov    $0x1323ed5,%ebp
  lea    0x14(%rsp),%r14
  lea    0x10(%rsp),%r13
  lea    0xc(%rsp),%r12
  nopw   0x0(%rax,%rax,1)
L4:
  mov    %rbp,%rdi
  call   <get_day_of_week@plt>
  mov    %rbp,%rdi
  mov    %eax,%r15d
  call   <add_a_day@plt>
  add    $0x1,%r15d
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <is_valid_date@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <get_day_of_week@plt>
  mov    %r15d,%ecx
  xor    %edi,%edi
  mov    %eax,%edx
  movslq %r15d,%rax
  sar    $0x1f,%ecx
  imul   $0xffffffff92492493,%rax,%rax
  shr    $0x20,%rax
  add    %r15d,%eax
  sar    $0x2,%eax
  sub    %ecx,%eax
  lea    0x0(,%rax,8),%ecx
  sub    %eax,%ecx
  movslq %edx,%rax
  imul   $0xffffffff92492493,%rax,%rax
  sub    %ecx,%r15d
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  shr    $0x20,%rax
  add    %edx,%eax
  sar    $0x2,%eax
  sub    %ecx,%eax
  lea    0x0(,%rax,8),%ecx
  sub    %eax,%ecx
  sub    %ecx,%edx
  cmp    %edx,%r15d
  sete   %dil
  call   <assert@plt>
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <long_to_date@plt>
  mov    0xc(%rsp),%edi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  call   <date_to_long@plt>
  xor    %edi,%edi
  cmp    %rbp,%rax
  sete   %dil
  call   <assert@plt>
  sub    $0x1,%ebx
  jne    L4
  mov    $0xb2b60,%ebx
  nopl   0x0(%rax)
L15:
  mov    %rbp,%rdi
  call   <get_day_of_week@plt>
  mov    %rbp,%rdi
  mov    %eax,%r15d
  call   <subtract_a_day@plt>
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <get_day_of_week@plt>
  xor    %edi,%edi
  lea    0x1(%rax),%edx
  movslq %edx,%rax
  mov    %edx,%ecx
  imul   $0xffffffff92492493,%rax,%rax
  sar    $0x1f,%ecx
  shr    $0x20,%rax
  add    %edx,%eax
  sar    $0x2,%eax
  sub    %ecx,%eax
  lea    0x0(,%rax,8),%ecx
  sub    %eax,%ecx
  movslq %r15d,%rax
  imul   $0xffffffff92492493,%rax,%rax
  sub    %ecx,%edx
  mov    %r15d,%ecx
  sar    $0x1f,%ecx
  shr    $0x20,%rax
  add    %r15d,%eax
  sar    $0x2,%eax
  sub    %ecx,%eax
  lea    0x0(,%rax,8),%ecx
  sub    %eax,%ecx
  sub    %ecx,%r15d
  cmp    %r15d,%edx
  sete   %dil
  call   <assert@plt>
  sub    $0x1,%ebx
  jne    L15
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <long_to_date@plt>
  xor    %edi,%edi
  cmpl   $0x7d7,0xc(%rsp)
  sete   %dil
  call   <assert@plt>
  xor    %edi,%edi
  cmpl   $0x1,0x10(%rsp)
  sete   %dil
  call   <assert@plt>
  xor    %edi,%edi
  cmpl   $0x1,0x14(%rsp)
  sete   %dil
  call   <assert@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L41
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L41:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void date_tester() {
  int i;
  long l;
  assert(is_valid_date(20070101));
  assert(is_valid_date(20080202));
  assert(is_valid_date(20090303));
  assert(is_valid_date(20100404));
  assert(is_valid_date(20110505));
  assert(is_valid_date(20121212));
  assert(!is_valid_date(20071301));
  assert(!is_valid_date(20071232));
  assert(!is_valid_date(20081232));
  assert(!is_valid_date(20110030));
  assert(!is_valid_date(20070631));
  assert(!is_valid_date(20071131));
  assert(!is_valid_date(20070431));
  assert(!is_valid_date(20290631));
  assert(!is_valid_date(99990931));
  assert(!is_valid_date(59990931));
  assert(is_valid_date(20080229));
  assert(!is_valid_date(20090229));
  assert(!is_valid_date(20100229));
  assert(!is_valid_date(20110229));
  assert(is_valid_date(20120229));
  assert(!is_valid_date(23000229));
  assert(is_valid_date(24000229));
  assert(get_day_of_week(20070611) == 1);
  assert(get_day_of_week(20070612) == 2);
  assert(get_day_of_week(20070610) == 0);
  assert(get_day_of_week(20070613) == 3);
  assert(get_day_of_week(20080101) == 2);
  assert(get_day_of_week(20080229) == 5);
  assert(get_day_of_week(20080125) == 5);
  assert(add_a_day(20071231) == 20080101);
  assert(subtract_a_day(20080101) == 20071231);
  for (l = 20070101; l < 23991230; l = add_a_day(l))
    assert(subtract_a_day(add_a_day(l)) == l);
  for (l = 99070101; l < 99991230; l = add_a_day(l))
    assert(add_a_day(subtract_a_day(l)) == l);
  l = 20070101;
  for (i = 0; i < 366 * 2000; ++i) {
    int dow1 = get_day_of_week(l);
    l = add_a_day(l);
    assert(is_valid_date(l));
    int dow2 = get_day_of_week(l);
    assert((dow1 + 1) % 7 == dow2 % 7);
    int y, m, d;
    long_to_date(l, &y, &m, &d);
    assert(l == date_to_long(y, m, d));
  }
  for (i = 0; i < 366 * 2000; ++i) {
    int dow1 = get_day_of_week(l);
    l = subtract_a_day(l);
    int dow2 = get_day_of_week(l);
    assert((dow2 + 1) % 7 == dow1 % 7);
  }
  int y2, m2, d2;
  long_to_date(l, &y2, &m2, &d2);
  assert(y2 == 2007);
  assert(m2 == 1);
  assert(d2 == 1);
}
```