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

```asm
<ffs2tm>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    0xa0(%rsp),%r14
  mov    0xa8(%rsp),%r13
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  mov    0x0(%r13),%eax
  test   %eax,%eax
  jg     L521
  mov    %rdi,%rbx
  mov    %r8,%rbp
  mov    %r9,%r12
  test   %rsi,%rsi
  je     L119
  movl   $0x0,(%rsi)
L119:
  test   %rdx,%rdx
  je     L533
  movl   $0x0,(%rdx)
L533:
  test   %rcx,%rcx
  je     L420
  movl   $0x0,(%rcx)
L420:
  test   %rbp,%rbp
  je     L150
  movl   $0x0,0x0(%rbp)
L150:
  test   %r12,%r12
  je     L250
  movl   $0x0,(%r12)
L250:
  test   %r14,%r14
  je     L217
  movq   $0x0,(%r14)
L217:
  test   %rbx,%rbx
  je     L408
  movzbl 0x2(%rbx),%eax
  cmp    $0x2f,%al
  je     L352
  cmpb   $0x2d,0x4(%rbx)
  je     L352
  cmp    $0x3a,%al
  jne    L189
  cmpb   $0x3a,0x5(%rbx)
  je     L424
L189:
  lea    D78(%rip),%rdi
  call   <ffpmsg@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
L521:
  mov    0x58(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L383
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L408:
  lea    D92(%rip),%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L352:
  mov    %r13,%r8
  mov    %rbx,%rdi
  call   <ffs2dt@plt>
  test   %rax,%rax
  jle    L76
  mov    0x0(%r13),%eax
  jmp    L521
L76:
  mov    %rbx,%rdi
  call   <strlen@plt>
  mov    %eax,%r15d
  and    $0xfffffffd,%eax
  cmp    $0x8,%eax
  je     L299
  cmp    $0x12,%r15d
  jle    L526
  cmpb   $0x54,0xa(%rbx)
  je     L219
L215:
  test   %rbp,%rbp
  je     L243
  mov    0x0(%rbp),%eax
  cmp    $0x17,%eax
  ja     L309
L243:
  test   %r12,%r12
  je     L311
  mov    (%r12),%eax
  cmp    $0x3b,%eax
  ja     L554
L311:
  test   %r14,%r14
  je     L169
  movsd  (%r14),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm0,%xmm1
  ja     L142
  comisd D21(%rip),%xmm0
  jae    L142
L169:
  mov    0x0(%r13),%eax
  jmp    L521
L299:
  mov    0x0(%r13),%eax
  jmp    L521
L526:
  lea    D78(%rip),%rdi
  call   <ffpmsg@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L219:
  cmpb   $0x3a,0xd(%rbx)
  jne    L215
  cmpb   $0x3a,0x10(%rbx)
  jne    L215
  movsbl 0xb(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L585
  movsbl 0xc(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L585
  movsbl 0xe(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L585
  movsbl 0xf(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L585
  movsbl 0x11(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L585
  movsbl 0x12(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L585
  cmp    $0x13,%r15d
  jle    L120
  cmpb   $0x2e,0x13(%rbx)
  jne    L132
L120:
  test   %rbp,%rbp
  je     L286
  lea    0xb(%rbx),%rdi
  call   <atoi@plt>
  mov    %eax,0x0(%rbp)
L286:
  test   %r12,%r12
  je     L13
  lea    0xe(%rbx),%rdi
  call   <atoi@plt>
  mov    %eax,(%r12)
L13:
  test   %r14,%r14
  je     L215
  lea    0x11(%rbx),%rdi
  call   <atof@plt>
  movsd  %xmm0,(%r14)
  jmp    L215
L132:
  lea    D78(%rip),%rdi
  call   <ffpmsg@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L585:
  lea    D78(%rip),%rdi
  call   <ffpmsg@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L424:
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L293
  movsbl 0x1(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L293
  movsbl 0x3(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L293
  movsbl 0x4(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L293
  movsbl 0x6(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L293
  movsbl 0x7(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L293
  test   %rbp,%rbp
  je     L559
  mov    %rbx,%rdi
  call   <atoi@plt>
  mov    %eax,0x0(%rbp)
L559:
  test   %r12,%r12
  je     L543
  lea    0x3(%rbx),%rdi
  call   <atoi@plt>
  mov    %eax,(%r12)
L543:
  test   %r14,%r14
  je     L215
  lea    0x6(%rbx),%rdi
  call   <atof@plt>
  movsd  %xmm0,(%r14)
  jmp    L215
L293:
  lea    D78(%rip),%rdi
  call   <ffpmsg@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L309:
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    %rsp,%rbx
  lea    D1(%rip),%rdx
  mov    $0x51,%esi
  mov    %rbx,%rdi
  call   <snprintf@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L554:
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    %rsp,%rbx
  lea    D40(%rip),%rdx
  mov    $0x51,%esi
  mov    %rbx,%rdi
  call   <snprintf@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L142:
  mov    %rsp,%rbx
  lea    D42(%rip),%rdx
  mov    $0x51,%esi
  mov    %rbx,%rdi
  call   <snprintf@plt>
  mov    %rbx,%rdi
  call   <ffpmsg@plt>
  movl   $0x1a4,0x0(%r13)
  mov    $0x1a4,%eax
  jmp    L521
L383:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D78
datatype: string
name: disassemble_data
arguments: label: D92
datatype: string
name: disassemble_data
arguments: label: D21
datatype: f64
name: disassemble_data
arguments: label: D1
datatype: string
name: disassemble_data
arguments: label: D40
datatype: string
name: disassemble_data
arguments: label: D42
datatype: string

tool: D78: input date string has illegal format:

tool: D92: error: null input date string (ffs2tm)

tool: D21: 61

tool: D1: hour value is out of range 0 - 23: %d (ffs2tm)

tool: D40: minute value is out of range 0 - 59: %d (ffs2tm)

tool: D42: second value is out of range 0 - 60.9999: %f (ffs2tm)

assistant: ```c
int ffs2tm(char *datestr, int *year, int *month, int *day, int *hour, int *minute, double *second, int *status) {
  int slen;
  char errmsg[81];
  if (*status > 0)
    return (*status);
  if (year)
    *year = 0;
  if (month)
    *month = 0;
  if (day)
    *day = 0;
  if (hour)
    *hour = 0;
  if (minute)
    *minute = 0;
  if (second)
    *second = 0.;
  if (!datestr) {
    ffpmsg("error: null input date string (ffs2tm)");
    return (*status = 420);
  }
  if (datestr[2] == '/' || datestr[4] == '-') {
    if (ffs2dt(datestr, year, month, day, status) > 0)
      return (*status);
    slen = strlen(datestr);
    if (slen == 8 || slen == 10)
      return (*status);
    else if (slen < 19) {
      ffpmsg("input date string has illegal format:");
      ffpmsg(datestr);
      return (*status = 420);
    } else if (datestr[10] == 'T' && datestr[13] == ':' && datestr[16] == ':') {
      if (isdigit((int)datestr[11]) && isdigit((int)datestr[12]) && isdigit((int)datestr[14]) && isdigit((int)datestr[15]) && isdigit((int)datestr[17]) && isdigit((int)datestr[18])) {
        if (slen > 19 && datestr[19] != '.') {
          ffpmsg("input date string has illegal format:");
          ffpmsg(datestr);
          return (*status = 420);
        }
        if (hour)
          *hour = atoi(&datestr[11]);
        if (minute)
          *minute = atoi(&datestr[14]);
        if (second)
          *second = atof(&datestr[17]);
      } else {
        ffpmsg("input date string has illegal format:");
        ffpmsg(datestr);
        return (*status = 420);
      }
    }
  } else {
    if (datestr[2] == ':' && datestr[5] == ':') {
      if (isdigit((int)datestr[0]) && isdigit((int)datestr[1]) && isdigit((int)datestr[3]) && isdigit((int)datestr[4]) && isdigit((int)datestr[6]) && isdigit((int)datestr[7])) {
        if (hour)
          *hour = atoi(&datestr[0]);
        if (minute)
          *minute = atoi(&datestr[3]);
        if (second)
          *second = atof(&datestr[6]);
      } else {
        ffpmsg("input date string has illegal format:");
        ffpmsg(datestr);
        return (*status = 420);
      }
    } else {
      ffpmsg("input date string has illegal format:");
      ffpmsg(datestr);
      return (*status = 420);
    }
  }
  if (hour)
    if (*hour < 0 || *hour > 23) {
      snprintf(errmsg, 81, "hour value is out of range 0 - 23: %d (ffs2tm)", *hour);
      ffpmsg(errmsg);
      return (*status = 420);
    }
  if (minute)
    if (*minute < 0 || *minute > 59) {
      snprintf(errmsg, 81, "minute value is out of range 0 - 59: %d (ffs2tm)", *minute);
      ffpmsg(errmsg);
      return (*status = 420);
    }
  if (second)
    if (*second < 0 || *second >= 61.) {
      snprintf(errmsg, 81, "second value is out of range 0 - 60.9999: %f (ffs2tm)", *second);
      ffpmsg(errmsg);
      return (*status = 420);
    }
  return (*status);
}
```