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

```asm
<Decode_xorriso_timestamp>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x40,%rsp
  mov    %rdi,%rbp
  mov    %rsi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x14(%rsp)
  movl   $0x0,0x18(%rsp)
  movl   $0x0,0x1c(%rsp)
  mov    $0x1c,%edx
  mov    $0x0,%esi
  call   <memset@plt>
  movl   $0xffffffff,0x0(%rbp)
  mov    %rbx,%rdi
  call   <strlen@plt>
  mov    %eax,%r12d
  lea    -0xa(%rax),%edx
  mov    $0x0,%eax
  cmp    $0x7,%edx
  jbe    L43
L11:
  mov    0x38(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L67
  add    $0x40,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L43:
  lea    0x20(%rsp),%rdi
  mov    %rbx,%rsi
  call   <strcpy@plt>
  movzbl 0x20(%rsp),%edi
  test   %dil,%dil
  je     L31
  mov    $0x1,%ebx
L189:
  movsbl %dil,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L45
  movzbl 0x20(%rsp,%rbx,1),%edi
  cmp    $0x3,%ebx
  setle  %dl
  test   %dil,%dil
  setne  %al
  add    $0x1,%rbx
  test   %al,%dl
  jne    L189
L31:
  mov    $0x0,%eax
  cmpb   $0x2e,0x24(%rsp)
  jne    L11
  movb   $0x0,0x24(%rsp)
  lea    0x8(%rsp),%rdx
  lea    0x20(%rsp),%rdi
  lea    D56(%rip),%rsi
  call   <sscanf@plt>
  mov    0x8(%rsp),%eax
  lea    -0x76c(%rax),%edx
  mov    $0x0,%eax
  cmp    $0x44c,%edx
  ja     L11
  movsbl 0x25(%rsp),%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movsbl 0x26(%rsp),%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  cmpb   $0x2e,0x27(%rsp)
  jne    L11
  movb   $0x0,0x27(%rsp)
  lea    0xc(%rsp),%rdx
  lea    0x25(%rsp),%rdi
  lea    D56(%rip),%rsi
  call   <sscanf@plt>
  mov    0xc(%rsp),%eax
  lea    -0x1(%rax),%edx
  mov    $0x0,%eax
  cmp    $0xb,%edx
  ja     L11
  movsbl 0x28(%rsp),%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movsbl 0x29(%rsp),%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movzbl 0x2a(%rsp),%edx
  cmp    $0x2e,%dl
  je     L94
  test   %dl,%dl
  jne    L11
L94:
  movb   $0x0,0x2a(%rsp)
  lea    0x10(%rsp),%rdx
  lea    0x28(%rsp),%rdi
  lea    D56(%rip),%rsi
  call   <sscanf@plt>
  mov    0x10(%rsp),%eax
  sub    $0x1,%eax
  cmp    $0x1e,%eax
  ja     L157
  cmp    $0xa,%r12d
  je     L145
  movsbl 0x2b(%rsp),%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movsbl 0x2c(%rsp),%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movsbl 0x2d(%rsp),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L403
  cmpb   $0x0,0x2d(%rsp)
  jne    L199
L403:
  movzbl 0x2d(%rsp),%ebx
  movb   $0x0,0x2d(%rsp)
  lea    0x14(%rsp),%rdx
  lea    0x2b(%rsp),%rdi
  lea    D56(%rip),%rsi
  call   <sscanf@plt>
  mov    %bl,0x2d(%rsp)
  cmpl   $0x17,0x14(%rsp)
  ja     L330
  cmp    $0xd,%r12d
  je     L145
  movsbl %bl,%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movsbl 0x2e(%rsp),%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movsbl 0x2f(%rsp),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L398
  cmpb   $0x0,0x2f(%rsp)
  jne    L246
L398:
  movzbl 0x2f(%rsp),%ebx
  movb   $0x0,0x2f(%rsp)
  lea    0x18(%rsp),%rdx
  lea    0x2d(%rsp),%rdi
  lea    D56(%rip),%rsi
  call   <sscanf@plt>
  mov    %bl,0x2f(%rsp)
  cmpl   $0x3b,0x18(%rsp)
  ja     L320
  cmp    $0xf,%r12d
  je     L145
  movsbl %bl,%edi
  call   <isdigit@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  je     L11
  movsbl 0x30(%rsp),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L137
  mov    $0x0,%eax
  cmpb   $0x0,0x31(%rsp)
  jne    L11
  lea    0x1c(%rsp),%rdx
  lea    0x2f(%rsp),%rdi
  lea    D56(%rip),%rsi
  call   <sscanf@plt>
  cmpl   $0x3b,0x1c(%rsp)
  ja     L382
L145:
  mov    0x8(%rsp),%eax
  sub    $0x76c,%eax
  mov    %eax,0x4(%rbp)
  mov    0xc(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x8(%rbp)
  mov    0x10(%rsp),%eax
  mov    %eax,0xc(%rbp)
  mov    0x14(%rsp),%eax
  mov    %eax,0x10(%rbp)
  mov    0x18(%rsp),%eax
  mov    %eax,0x14(%rbp)
  mov    0x1c(%rsp),%eax
  mov    %eax,0x18(%rbp)
  mov    $0x1,%eax
  jmp    L11
L45:
  mov    $0x0,%eax
  jmp    L11
L157:
  mov    $0x0,%eax
  jmp    L11
L199:
  mov    $0x0,%eax
  jmp    L11
L330:
  mov    $0x0,%eax
  jmp    L11
L246:
  mov    $0x0,%eax
  jmp    L11
L320:
  mov    $0x0,%eax
  jmp    L11
L137:
  mov    $0x0,%eax
  jmp    L11
L382:
  mov    $0x0,%eax
  jmp    L11
L67:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D56
type_guessed: string

tool: D56: %d

assistant: ```c
int Decode_xorriso_timestamp(struct tm *erg, char *code, int flag) {
  char buf[20];
  int year, month, day, hour = 0, minute = 0, second = 0, i, l, mem;
  memset(erg, 0, sizeof(*erg));
  erg->tm_isdst = -1;
  l = strlen(code);
  if (l > 17 || l < 10)
    return (0);
  strcpy(buf, code);
  for (i = 0; buf[i] != 0 && i < 4; i++)
    if (!isdigit(buf[i]))
      return (0);
  if (buf[4] != '.')
    return (0);
  buf[4] = 0;
  sscanf(buf, "%d", &year);
  if (year < 1900 || year > 3000)
    return (0);
  if (!(isdigit(buf[5]) && isdigit(buf[6]) && buf[7] == '.'))
    return (0);
  buf[7] = 0;
  sscanf(buf + 5, "%d", &month);
  if (month < 1 || month > 12)
    return (0);
  if (!(isdigit(buf[8]) && isdigit(buf[9]) && (buf[10] == '.' || buf[10] == 0)))
    return (0);
  buf[10] = 0;
  sscanf(buf + 8, "%d", &day);
  if (day < 1 || day > 31)
    return (0);
  if (l == 10)
    goto done;
  if (!(isdigit(buf[11]) && isdigit(buf[12]) && (isdigit(buf[13]) || buf[13] == 0)))
    return (0);
  mem = buf[13];
  buf[13] = 0;
  sscanf(buf + 11, "%d", &hour);
  buf[13] = mem;
  if (hour < 0 || hour > 23)
    return (0);
  if (l == 13)
    goto done;
  if (!(isdigit(buf[13]) && isdigit(buf[14]) && (isdigit(buf[15]) || buf[15] == 0)))
    return (0);
  mem = buf[15];
  buf[15] = 0;
  sscanf(buf + 13, "%d", &minute);
  buf[15] = mem;
  if (minute < 0 || minute > 59)
    return (0);
  if (l == 15)
    goto done;
  if (!(isdigit(buf[15]) && isdigit(buf[16]) && buf[17] == 0))
    return (0);
  sscanf(buf + 15, "%d", &second);
  if (second < 0 || second > 59)
    return (0);
done:;
  erg->tm_year = year - 1900;
  erg->tm_mon = month - 1;
  erg->tm_mday = day;
  erg->tm_hour = hour;
  erg->tm_min = minute;
  erg->tm_sec = second;
  return (1);
}
```