user: Demonstrate the C code that generates the assembly output below:

```asm
<X509_cmp_time>:
  endbr64
  push   %r15
  push   %r14
  mov    %rsi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x68,%rsp
  mov    D0(%rip),%r12
  mov    (%rdi),%ebp
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  mov    0x8(%rdi),%r13
  mov    (%r12),%rax
  cmp    %rax,0x10(%rdi)
  je     L312
  lea    -0xd(%rbp),%eax
  cmp    $0xa,%eax
  jbe    L305
L200:
  xor    %eax,%eax
L243:
  mov    0x58(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L217
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L305:
  lea    0x20(%rsp),%r15
  mov    $0xc,%edx
  mov    %r13,%rsi
  sub    $0xc,%ebp
  mov    %r15,%rdi
  call   <memcpy@plt>
  lea    0xc(%r13),%rax
  lea    0x2c(%rsp),%rdx
L310:
  movzbl (%rax),%ecx
  lea    -0x2b(%rcx),%esi
  and    $0xfd,%esi
  je     L147
  cmp    $0x5a,%cl
  jne    L71
L147:
  mov    $0x3030,%edi
  lea    0x2(%rdx),%rsi
  mov    %di,(%rdx)
L198:
  mov    $0x5a,%edx
  mov    %dx,(%rsi)
L160:
  movzbl (%rax),%edx
  cmp    $0x5a,%dl
  je     L72
  lea    -0x2b(%rdx),%ecx
  and    $0xfd,%ecx
  jne    L200
  cmp    $0x5,%ebp
  jne    L200
  movzbl 0x1(%rax),%edi
  lea    -0x30(%rdi),%ecx
  cmp    $0x9,%cl
  ja     L200
  movzbl 0x2(%rax),%edi
  lea    -0x30(%rdi),%esi
  cmp    $0x9,%sil
  ja     L200
  movzbl 0x3(%rax),%edi
  sub    $0x30,%edi
  cmp    $0x9,%dil
  ja     L200
  movzbl 0x4(%rax),%eax
  sub    $0x30,%eax
  cmp    $0x9,%al
  ja     L200
  movsbl %cl,%ecx
  movsbl %sil,%esi
  movsbl %dil,%edi
  movsbl %al,%eax
  lea    (%rcx,%rcx,4),%ecx
  lea    (%rsi,%rcx,2),%ecx
  lea    (%rdi,%rdi,4),%esi
  imul   $0x3c,%ecx,%ecx
  lea    (%rax,%rsi,2),%eax
  cltq
  movslq %ecx,%rcx
  add    %rcx,%rax
  cmp    $0x2d,%dl
  mov    %rax,%rdx
  je     L84
  shl    $0x4,%rdx
  sub    %rax,%rdx
  lea    0x0(,%rdx,4),%rsi
  jmp    L307
  cs nopw 0x0(%rax,%rax,1)
L312:
  lea    -0xb(%rbp),%eax
  cmp    $0x6,%eax
  ja     L200
  lea    0x20(%rsp),%r15
  mov    $0xa,%edx
  mov    %r13,%rsi
  sub    $0xa,%ebp
  mov    %r15,%rdi
  call   <memcpy@plt>
  lea    0xa(%r13),%rax
  lea    0x2a(%rsp),%rdx
  jmp    L310
  nopw   0x0(%rax,%rax,1)
L71:
  cmp    $0x1,%ebp
  je     L200
  mov    %cl,(%rdx)
  movzbl 0x1(%rax),%ecx
  lea    0x2(%rdx),%rsi
  mov    %cl,0x1(%rdx)
  mov    %ebp,%ecx
  sub    $0x2,%ecx
  je     L200
  cmpb   $0x2e,0x2(%rax)
  je     L335
  add    $0x2,%rax
  mov    %ecx,%ebp
  jmp    L198
  xchg   %ax,%ax
L72:
  xor    %esi,%esi
  cmp    $0x1,%ebp
  jne    L200
L307:
  mov    0x10(%rbx),%rax
  lea    0x40(%rsp),%rbp
  mov    %rsp,%rdi
  mov    %r14,%rdx
  movq   $0x0,0x18(%rsp)
  mov    %rax,0x10(%rsp)
  movl   $0x18,(%rsp)
  mov    %rbp,0x8(%rsp)
  call   <X509_time_adj@plt>
  test   %rax,%rax
  je     L200
  mov    (%r12),%rax
  cmp    %rax,0x10(%rbx)
  je     L199
L238:
  mov    %rbp,%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L243
L237:
  or     $0xffffffff,%eax
  jmp    L243
  nopw   0x0(%rax,%rax,1)
L335:
  lea    -0x3(%rbp),%edi
  add    $0x3,%rax
  mov    %edi,%ebp
  test   %edi,%edi
  jne    L352
  jmp    L200
  nopw   0x0(%rax,%rax,1)
L82:
  test   %ebp,%ebp
  je     L102
L352:
  movzbl (%rax),%ecx
  sub    $0x30,%ecx
  cmp    $0x9,%cl
  ja     L198
  sub    $0x1,%ebp
  mov    %edi,%ecx
  add    $0x1,%rax
  sub    %ebp,%ecx
  cmp    $0x2,%ecx
  jle    L82
L102:
  mov    $0x5a,%ecx
  mov    %cx,0x2(%rdx)
  test   %ebp,%ebp
  je     L200
  jmp    L160
  nopl   0x0(%rax)
L199:
  movsbl 0x20(%rsp),%eax
  lea    -0xf0(%rax,%rax,4),%edx
  movsbl 0x21(%rsp),%eax
  lea    -0x30(%rax,%rdx,2),%edx
  lea    0x64(%rdx),%eax
  cmp    $0x32,%edx
  cmovl  %eax,%edx
  movsbl 0x40(%rsp),%eax
  lea    -0xf0(%rax,%rax,4),%ecx
  movsbl 0x41(%rsp),%eax
  lea    -0x30(%rax,%rcx,2),%eax
  lea    0x64(%rax),%ecx
  cmp    $0x32,%eax
  cmovl  %ecx,%eax
  cmp    %eax,%edx
  jl     L237
  mov    $0x1,%eax
  jle    L238
  jmp    L243
L84:
  shl    $0x4,%rdx
  sub    %rdx,%rax
  lea    0x0(,%rax,4),%rsi
  jmp    L307
L217:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time) {
  char *str;
  ASN1_TIME atm;
  long offset;
  char buff1[24], buff2[24], *p;
  int i, j, remaining;
  p = buff1;
  remaining = ctm->length;
  str = (char *)ctm->data;
  if (ctm->type == V_ASN1_UTCTIME) {
    int min_length = sizeof("YYMMDDHHMMZ") - 1;
    int max_length = sizeof("YYMMDDHHMMSS+hhmm") - 1;
    if (remaining < min_length || remaining > max_length)
      return 0;
    memcpy(p, str, 10);
    p += 10;
    str += 10;
    remaining -= 10;
  } else {
    int min_length = sizeof("YYYYMMDDHHMMZ") - 1;
    int max_length = sizeof("YYYYMMDDHHMMSS.fff+hhmm") - 1;
    if (remaining < min_length || remaining > max_length)
      return 0;
    memcpy(p, str, 12);
    p += 12;
    str += 12;
    remaining -= 12;
  }
  if ((*str == 'Z') || (*str == '-') || (*str == '+')) {
    *(p++) = '0';
    *(p++) = '0';
  } else {
    if (remaining < 2)
      return 0;
    *(p++) = *(str++);
    *(p++) = *(str++);
    remaining -= 2;
    if (remaining && *str == '.') {
      str++;
      remaining--;
      for (i = 0; i < 3 && remaining; i++, str++, remaining--) {
        if (*str < '0' || *str > '9')
          break;
      }
    }
  }
  *(p++) = 'Z';
  *(p++) = '\0';
  if (!remaining)
    return 0;
  if (*str == 'Z') {
    if (remaining != 1)
      return 0;
    offset = 0;
  } else {
    if ((*str != '+') && (*str != '-'))
      return 0;
    if (remaining != 5)
      return 0;
    if (str[1] < '0' || str[1] > '9' || str[2] < '0' || str[2] > '9' || str[3] < '0' || str[3] > '9' || str[4] < '0' || str[4] > '9')
      return 0;
    offset = ((str[1] - '0') * 10 + (str[2] - '0')) * 60;
    offset += (str[3] - '0') * 10 + (str[4] - '0');
    if (*str == '-')
      offset = -offset;
  }
  atm.type = ctm->type;
  atm.flags = 0;
  atm.length = sizeof(buff2);
  atm.data = (unsigned char *)buff2;
  if (X509_time_adj(&atm, offset * 60, cmp_time) == NULL)
    return 0;
  if (ctm->type == V_ASN1_UTCTIME) {
    i = (buff1[0] - '0') * 10 + (buff1[1] - '0');
    if (i < 50)
      i += 100;
    j = (buff2[0] - '0') * 10 + (buff2[1] - '0');
    if (j < 50)
      j += 100;
    if (i < j)
      return -1;
    if (i > j)
      return 1;
  }
  i = strcmp(buff1, buff2);
  if (i == 0)
    return -1;
  else
    return i;
}
```