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

```asm
<crack_datetime>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %r8,-0x48(%rbp)
  mov    %r9,-0x50(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  mov    0x18(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x60(%rbp),%rdx
  lea    -0x10(%rbp),%rcx
  lea    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <get_datetime@plt>
  cmpq   $0x0,-0x28(%rbp)
  je     L63
  mov    -0x18(%rbp),%rcx
  mov    %rcx,%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  shr    $0x2,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x50,%eax
  jle    L34
  mov    $0x76c,%eax
  jmp    L8
L34:
  mov    $0x7d0,%eax
L8:
  add    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
L63:
  cmpq   $0x0,-0x30(%rbp)
  je     L91
  mov    -0x18(%rbp),%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  mov    %rdx,%rcx
  shr    $0x2,%rcx
  mov    %rcx,%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  shr    $0x2,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
L91:
  cmpq   $0x0,-0x38(%rbp)
  je     L73
  mov    -0x18(%rbp),%rax
  movabs $0x346dc5d63886594b,%rdx
  mul    %rdx
  shr    $0xb,%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,(%rax)
L73:
  cmpq   $0x0,-0x40(%rbp)
  je     L71
  mov    -0x10(%rbp),%rax
  movabs $0x431bde82d7b634db,%rdx
  mul    %rdx
  shr    $0x12,%rdx
  mov    -0x40(%rbp),%rax
  mov    %rdx,(%rax)
L71:
  cmpq   $0x0,-0x48(%rbp)
  je     L9
  mov    -0x10(%rbp),%rax
  movabs $0x346dc5d63886594b,%rdx
  mul    %rdx
  mov    %rdx,%rcx
  shr    $0xb,%rcx
  mov    %rcx,%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  shr    $0x2,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,(%rax)
L9:
  cmpq   $0x0,-0x50(%rbp)
  je     L35
  mov    -0x10(%rbp),%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  mov    %rdx,%rcx
  shr    $0x2,%rcx
  mov    %rcx,%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  shr    $0x2,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x50(%rbp),%rax
  mov    %rdx,(%rax)
L35:
  cmpq   $0x0,-0x58(%rbp)
  je     L64
  mov    -0x10(%rbp),%rcx
  mov    %rcx,%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  shr    $0x2,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x58(%rbp),%rax
  mov    %rdx,(%rax)
L64:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L45
  call   <__stack_chk_fail@plt>
L45:
  leave
  ret
```

assistant: ```c
void crack_datetime(int *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *hundredths, unsigned long *age) {
  unsigned long date, time;
  get_datetime(&date, &time, age);
  if (year) {
    *year = date % 100;
    *year += *year > 80 ? 1900 : 2000;
  }
  if (month)
    *month = (date / 100) % 100;
  if (day)
    *day = date / 10000;
  if (hour)
    *hour = time / 1000000;
  if (minute)
    *minute = (time / 10000) % 100;
  if (second)
    *second = (time / 100) % 100;
  if (hundredths)
    *hundredths = time % 100;
}
```