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

```asm
<ns_datetosecs>:
  endbr64
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <strlen@plt>
  cmp    $0xe,%eax
  je     L136
  movl   $0x1,0x0(%rbp)
  xor    %r8d,%r8d
L89:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L184
  add    $0x28,%rsp
  mov    %r8d,%eax
  pop    %rbx
  pop    %rbp
  ret
  nopw   0x0(%rax,%rax,1)
L136:
  movl   $0x0,0x0(%rbp)
  mov    %rsp,%rdi
  mov    $0x18,%edx
  xor    %esi,%esi
  call   <memset@plt>
  mov    %rbp,%r8
  mov    $0x270f,%ecx
  mov    %rbx,%rdi
  mov    $0x7c6,%edx
  mov    $0x4,%esi
  call   <datepart@plt>
  lea    0x4(%rbx),%rdi
  mov    %rbp,%r8
  mov    $0xc,%ecx
  sub    $0x76c,%rax
  mov    $0x1,%edx
  mov    $0x2,%esi
  mov    %eax,(%rsp)
  call   <datepart@plt>
  lea    0x6(%rbx),%rdi
  mov    %rbp,%r8
  mov    $0x1f,%ecx
  sub    $0x1,%rax
  mov    $0x1,%edx
  mov    $0x2,%esi
  mov    %eax,0x4(%rsp)
  call   <datepart@plt>
  lea    0x8(%rbx),%rdi
  mov    %rbp,%r8
  xor    %edx,%edx
  mov    $0x17,%ecx
  mov    $0x2,%esi
  mov    %eax,0x8(%rsp)
  call   <datepart@plt>
  lea    0xa(%rbx),%rdi
  mov    %rbp,%r8
  xor    %edx,%edx
  mov    $0x3b,%ecx
  mov    $0x2,%esi
  mov    %eax,0xc(%rsp)
  call   <datepart@plt>
  mov    %rbp,%r8
  xor    %edx,%edx
  lea    0xc(%rbx),%rdi
  mov    $0x3b,%ecx
  mov    $0x2,%esi
  mov    %eax,0x10(%rsp)
  call   <datepart@plt>
  mov    0x0(%rbp),%edx
  xor    %r8d,%r8d
  test   %edx,%edx
  jne    L89
  imul   $0x3c,0x10(%rsp),%ecx
  mov    0x8(%rsp),%ebx
  mov    0x4(%rsp),%r8d
  lea    -0x1(%rbx),%esi
  add    %eax,%ecx
  imul   $0xe10,0xc(%rsp),%eax
  imul   $0x15180,%esi,%esi
  add    %ecx,%eax
  add    %eax,%esi
  test   %r8d,%r8d
  jle    L90
  lea    -0x1(%r8),%ecx
  lea    D8(%rip),%rax
  lea    (%rax,%rcx,4),%rdi
  mov    $0x1f,%ecx
  jmp    L21
  nopl   (%rax)
L23:
  mov    (%rax),%ecx
  add    $0x4,%rax
L21:
  add    %ecx,%edx
  cmp    %rdi,%rax
  jne    L23
  imul   $0x15180,%edx,%edx
  mov    (%rsp),%ecx
  add    %edx,%esi
  cmp    $0x1,%r8d
  jle    L18
  lea    0x76c(%rcx),%eax
  test   $0x3,%cl
  jne    L45
  imul   $0xc28f5c29,%eax,%edx
  add    $0x51eb850,%edx
  ror    $0x2,%edx
  cmp    $0x28f5c28,%edx
  jbe    L45
L22:
  add    $0x15180,%esi
L18:
  lea    -0x46(%rcx),%r8d
  imul   $0x1e13380,%r8d,%r8d
  add    %esi,%r8d
  cmp    $0x46,%ecx
  jle    L89
  add    $0x76c,%ecx
  mov    $0x7b2,%eax
  jmp    L52
  cs nopw 0x0(%rax,%rax,1)
L139:
  imul   $0xc28f5c29,%eax,%edx
  ror    $0x2,%edx
  cmp    $0x28f5c28,%edx
  jbe    L169
L151:
  add    $0x15180,%r8d
L96:
  add    $0x1,%eax
  cmp    %eax,%ecx
  je     L89
L52:
  test   $0x3,%al
  je     L139
L169:
  imul   $0xc28f5c29,%eax,%edx
  ror    $0x4,%edx
  cmp    $0xa3d70a,%edx
  ja     L96
  jmp    L151
  nopw   0x0(%rax,%rax,1)
L45:
  imul   $0xc28f5c29,%eax,%eax
  add    $0x51eb850,%eax
  ror    $0x4,%eax
  cmp    $0xa3d70a,%eax
  ja     L18
  jmp    L22
  xchg   %ax,%ax
L90:
  mov    (%rsp),%ecx
  jmp    L18
L184:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D8
datatype: string

tool: D8: 

assistant: ```c
u_int32_t ns_datetosecs(const char *cp, int *errp) {
  struct tm time;
  u_int32_t result;
  int mdays, i;
  static const int days_per_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  if (strlen(cp) != 14U) {
    *errp = 1;
    return (0);
  }
  *errp = 0;
  memset(&time, 0, sizeof time);
  time.tm_year = datepart(cp + 0, 4, 1990, 9999, errp) - 1900;
  time.tm_mon = datepart(cp + 4, 2, 01, 12, errp) - 1;
  time.tm_mday = datepart(cp + 6, 2, 01, 31, errp);
  time.tm_hour = datepart(cp + 8, 2, 00, 23, errp);
  time.tm_min = datepart(cp + 10, 2, 00, 59, errp);
  time.tm_sec = datepart(cp + 12, 2, 00, 59, errp);
  if (*errp)
    return (0);
  result = time.tm_sec;
  result += time.tm_min * 60;
  result += time.tm_hour * (60 * 60);
  result += (time.tm_mday - 1) * ((u_int32_t)24 * 60 * 60);
  mdays = 0;
  for (i = 0; i < time.tm_mon; i++)
    mdays += days_per_month[i];
  result += mdays * ((u_int32_t)24 * 60 * 60);
  if (time.tm_mon > 1 && ((((1900 + time.tm_year) % 4) == 0 && ((1900 + time.tm_year) % 100) != 0) || ((1900 + time.tm_year) % 400) == 0))
    result += ((u_int32_t)24 * 60 * 60);
  result += (time.tm_year - 70) * (((u_int32_t)24 * 60 * 60) * 365);
  for (i = 70; i < time.tm_year; i++)
    if (((((1900 + i) % 4) == 0 && ((1900 + i) % 100) != 0) || ((1900 + i) % 400) == 0))
      result += ((u_int32_t)24 * 60 * 60);
  return (result);
}
```