user: What is the c source code of the assembly code below:

```asm
<ASN1_put_object>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %edx,-0x30(%rbp)
  mov    %ecx,-0x34(%rbp)
  mov    %r8d,-0x38(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  je     L116
  mov    D16(%rip),%rax
  mov    (%rax),%eax
  jmp    L52
L116:
  mov    $0x0,%eax
L52:
  mov    %eax,-0x18(%rbp)
  mov    D34(%rip),%rax
  mov    (%rax),%eax
  and    -0x38(%rbp),%eax
  or     %eax,-0x18(%rbp)
  cmpl   $0x1e,-0x34(%rbp)
  jg     L47
  mov    -0x34(%rbp),%eax
  mov    %eax,%edx
  mov    D35(%rip),%rax
  mov    (%rax),%eax
  and    %eax,%edx
  mov    -0x18(%rbp),%eax
  mov    %edx,%ecx
  or     %eax,%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L110
L47:
  mov    -0x18(%rbp),%eax
  mov    %eax,%edx
  mov    D35(%rip),%rax
  mov    (%rax),%eax
  mov    %edx,%ecx
  or     %eax,%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  movl   $0x0,-0x18(%rbp)
  mov    -0x34(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  jmp    L58
L4:
  sarl   $0x7,-0x14(%rbp)
  addl   $0x1,-0x18(%rbp)
L58:
  cmpl   $0x0,-0x14(%rbp)
  jg     L4
  mov    -0x18(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  jmp    L48
L18:
  mov    -0x34(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x10(%rbp),%rdx
  mov    -0x18(%rbp),%eax
  cltq
  add    %rdx,%rax
  and    $0x7f,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x18(%rbp)
  je     L93
  mov    -0x10(%rbp),%rdx
  mov    -0x18(%rbp),%eax
  cltq
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%eax
  cltq
  add    %rcx,%rax
  or     $0xffffff80,%edx
  mov    %dl,(%rax)
L93:
  sarl   $0x7,-0x34(%rbp)
L48:
  mov    -0x18(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x18(%rbp)
  test   %eax,%eax
  jg     L18
  mov    -0x10(%rbp),%rdx
  mov    -0x14(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
L110:
  cmpl   $0x2,-0x2c(%rbp)
  jne    L82
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x80,(%rax)
  jmp    L86
L82:
  mov    -0x30(%rbp),%edx
  lea    -0x10(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <asn1_put_length@plt>
L86:
  mov    -0x10(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L101
  call   <__stack_chk_fail@plt>
L101:
  leave
  ret
```

assistant: ```c
void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag, int xclass) {
  unsigned char *p = *pp;
  int i, ttag;
  i = (constructed) ? V_ASN1_CONSTRUCTED : 0;
  i |= (xclass & V_ASN1_PRIVATE);
  if (tag < 31)
    *(p++) = i | (tag & V_ASN1_PRIMITIVE_TAG);
  else {
    *(p++) = i | V_ASN1_PRIMITIVE_TAG;
    for (i = 0, ttag = tag; ttag > 0; i++)
      ttag >>= 7;
    ttag = i;
    while (i-- > 0) {
      p[i] = tag & 0x7f;
      if (i != (ttag - 1))
        p[i] |= 0x80;
      tag >>= 7;
    }
    p += ttag;
  }
  if (constructed == 2)
    *(p++) = 0x80;
  else
    asn1_put_length(&p, length);
  *pp = p;
}
```