user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<compare_date>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rsi,%rbx
  mov    %rdi,%rsi
  sub    $0x78,%rsp
  mov    %edx,0x24(%rsp)
  lea    0x5e(%rsp),%r9
  mov    $0x4,%edx
  lea    0x40(%rsp),%r14
  mov    %r9,%rdi
  lea    0x4f(%rsp),%r15
  lea    0x55(%rsp),%r12
  lea    0x58(%rsp),%r13
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  mov    %r9,0x38(%rsp)
  call   <memcpy@plt>
  lea    0x63(%rsp),%r8
  mov    %rbx,%rsi
  mov    $0x4,%edx
  mov    %r8,%rdi
  mov    %r8,0x10(%rsp)
  movb   $0x0,0x62(%rsp)
  call   <memcpy@plt>
  lea    0x5(%rbp),%rsi
  mov    %r14,%rdi
  mov    $0x2,%edx
  movb   $0x0,0x67(%rsp)
  call   <memcpy@plt>
  lea    0x43(%rsp),%rcx
  lea    0x5(%rbx),%rsi
  mov    $0x2,%edx
  mov    %rcx,%rdi
  mov    %rcx,0x30(%rsp)
  movb   $0x0,0x42(%rsp)
  call   <memcpy@plt>
  lea    0x46(%rsp),%rax
  lea    0x8(%rbp),%rsi
  mov    $0x2,%edx
  mov    %rax,%rdi
  movb   $0x0,0x45(%rsp)
  mov    %rax,0x18(%rsp)
  call   <memcpy@plt>
  lea    0x49(%rsp),%rcx
  lea    0x8(%rbx),%rsi
  mov    $0x2,%edx
  mov    %rcx,%rdi
  mov    %rcx,0x28(%rsp)
  movb   $0x0,0x48(%rsp)
  call   <memcpy@plt>
  lea    0x4c(%rsp),%r11
  lea    0x11(%rbp),%rsi
  mov    $0x2,%edx
  mov    %r11,%rdi
  mov    %r11,(%rsp)
  movb   $0x0,0x4b(%rsp)
  call   <memcpy@plt>
  lea    0x11(%rbx),%rsi
  mov    %r15,%rdi
  mov    $0x2,%edx
  movb   $0x0,0x4e(%rsp)
  call   <memcpy@plt>
  lea    0x52(%rsp),%r10
  lea    0xe(%rbp),%rsi
  mov    $0x2,%edx
  mov    %r10,%rdi
  mov    %r10,0x8(%rsp)
  movb   $0x0,0x51(%rsp)
  call   <memcpy@plt>
  lea    0xe(%rbx),%rsi
  mov    %r12,%rdi
  mov    $0x2,%edx
  movb   $0x0,0x54(%rsp)
  call   <memcpy@plt>
  lea    0xb(%rbp),%rsi
  mov    %r13,%rdi
  lea    0x5b(%rsp),%rbp
  mov    $0x2,%edx
  movb   $0x0,0x57(%rsp)
  call   <memcpy@plt>
  lea    0xb(%rbx),%rsi
  mov    $0x2,%edx
  mov    %rbp,%rdi
  movb   $0x0,0x5a(%rsp)
  call   <memcpy@plt>
  mov    (%rsp),%rdi
  movb   $0x0,0x5d(%rsp)
  call   <atoi@plt>
  mov    %r15,%rdi
  mov    %eax,(%rsp)
  call   <atoi@plt>
  mov    0x8(%rsp),%rdi
  mov    %eax,%r15d
  call   <atoi@plt>
  mov    %r12,%rdi
  mov    %eax,0x8(%rsp)
  call   <atoi@plt>
  mov    %r13,%rdi
  mov    %eax,%r12d
  call   <atoi@plt>
  mov    %rbp,%rdi
  mov    %eax,0x20(%rsp)
  call   <atoi@plt>
  mov    0x38(%rsp),%rdi
  mov    %eax,%r13d
  call   <atoi@plt>
  mov    0x10(%rsp),%rdi
  imul   $0xe10,%r13d,%r13d
  mov    %eax,%ebp
  call   <atoi@plt>
  mov    %r14,%rdi
  mov    %eax,%ebx
  call   <atoi@plt>
  mov    0x30(%rsp),%rdi
  imul   $0x1da9c00,%ebx,%ebx
  mov    %eax,0x10(%rsp)
  call   <atoi@plt>
  mov    0x18(%rsp),%rdi
  mov    %eax,%r14d
  call   <atoi@plt>
  mov    0x28(%rsp),%rdi
  imul   $0x278d00,%r14d,%r14d
  mov    %eax,0x18(%rsp)
  call   <atoi@plt>
  imul   $0x15180,%eax,%eax
  add    %r14d,%ebx
  add    %eax,%ebx
  add    %r13d,%ebx
  imul   $0x278d00,0x10(%rsp),%edx
  imul   $0x1da9c00,%ebp,%eax
  imul   $0x3c,%r12d,%r12d
  add    %edx,%eax
  imul   $0x15180,0x18(%rsp),%edx
  add    %r12d,%ebx
  add    %r15d,%ebx
  add    %edx,%eax
  imul   $0xe10,0x20(%rsp),%edx
  movslq %ebx,%rbx
  add    %edx,%eax
  imul   $0x3c,0x8(%rsp),%edx
  add    %edx,%eax
  add    (%rsp),%eax
  cltq
  sub    %rax,%rbx
  movslq 0x24(%rsp),%rax
  cmp    %rax,%rbx
  sete   %al
  mov    0x68(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L5
  add    $0x78,%rsp
  movzbl %al,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L5:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int compare_date(char *date_start, char *date_end, int timeslot) {
  char year_start[5];
  char year_end[5];
  char month_start[3];
  char month_end[3];
  char day_start[3];
  char day_end[3];
  char seconds_start[3];
  char seconds_end[3];
  char minutes_start[3];
  char minutes_end[3];
  char hours_start[3];
  char hours_end[3];
  memcpy(year_start, &date_start[0], 4);
  year_start[4] = '\0';
  memcpy(year_end, &date_end[0], 4);
  year_end[4] = '\0';
  memcpy(month_start, &date_start[5], 2);
  month_start[2] = '\0';
  memcpy(month_end, &date_end[5], 2);
  month_end[2] = '\0';
  memcpy(day_start, &date_start[8], 2);
  day_start[2] = '\0';
  memcpy(day_end, &date_end[8], 2);
  day_end[2] = '\0';
  memcpy(seconds_start, &date_start[17], 2);
  seconds_start[2] = '\0';
  memcpy(seconds_end, &date_end[17], 2);
  seconds_end[2] = '\0';
  memcpy(minutes_start, &date_start[14], 2);
  minutes_start[2] = '\0';
  memcpy(minutes_end, &date_end[14], 2);
  minutes_end[2] = '\0';
  memcpy(hours_start, &date_start[11], 2);
  hours_start[2] = '\0';
  memcpy(hours_end, &date_end[11], 2);
  hours_end[2] = '\0';
  int sec_start = atoi(seconds_start);
  int sec_end = atoi(seconds_end);
  int min_start = atoi(minutes_start);
  int min_end = atoi(minutes_end);
  int h_start = atoi(hours_start);
  int h_end = atoi(hours_end);
  int y_start = atoi(year_start);
  int y_end = atoi(year_end);
  int mon_start = atoi(month_start);
  int mon_end = atoi(month_end);
  int d_start = atoi(day_start);
  int d_end = atoi(day_end);
  long total_sec_end = 0;
  long total_sec_start = 0;
  total_sec_end = y_end * 31104000 + mon_end * 2592000 + d_end * 86400 + h_end * 3600 + min_end * 60 + sec_end;
  total_sec_start = y_start * 31104000 + mon_start * 2592000 + d_start * 86400 + h_start * 3600 + min_start * 60 + sec_start;
  if (total_sec_end - total_sec_start == timeslot)
    return 1;
  else
    return 0;
}
```