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

```asm
<print_varbind>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x2,-0x8(%rbp)
  subl   $0x2,-0x2c(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  addq   $0x2,-0x8(%rbp)
  subl   $0x2,-0x2c(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%ecx
  mov    $0xffffffcd,%edx
  mov    %edx,%eax
  mul    %cl
  shr    $0x8,%ax
  mov    %eax,%edx
  shr    $0x5,%dl
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  shl    $0x3,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  movzbl %dl,%edx
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0xffffffcd,%ecx
  mul    %cl
  shr    $0x8,%ax
  shr    $0x5,%al
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D0(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x14(%rbp)
  movl   $0x1,-0x18(%rbp)
  jmp    L83
L41:
  mov    -0x14(%rbp),%eax
  shl    $0x7,%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x7f,%eax
  add    %ecx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  js     L57
  mov    -0x14(%rbp),%eax
  mov    %eax,%esi
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x14(%rbp)
L57:
  addl   $0x1,-0x18(%rbp)
L83:
  mov    -0x18(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L41
  mov    $0x9,%edi
  call   <putchar@plt>
  mov    -0xc(%rbp),%eax
  cltq
  add    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  addq   $0x2,-0x8(%rbp)
  subl   $0x2,-0x2c(%rbp)
  cmpl   $0x4,-0x10(%rbp)
  jne    L73
  lea    D31(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x18(%rbp)
  jmp    L6
L54:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0x18(%rbp)
L6:
  mov    -0x18(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L54
  mov    $0xa,%edi
  call   <putchar@plt>
  jmp    L51
L73:
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x18(%rbp)
  jmp    L85
L43:
  mov    -0x14(%rbp),%eax
  shl    $0x7,%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x7f,%eax
  add    %ecx,%eax
  mov    %eax,-0x14(%rbp)
  addl   $0x1,-0x18(%rbp)
L85:
  mov    -0x18(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L43
  mov    -0x14(%rbp),%eax
  mov    %eax,%esi
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L51:
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D0
datatype: string
name: retrieve_data
arguments: label: D13
datatype: string
name: retrieve_data
arguments: label: D31
datatype: string
name: retrieve_data
arguments: label: D25
datatype: string
name: retrieve_data
arguments: label: D18
datatype: string

tool: D0: %d.%d

tool: D13: .%d

tool: D31: 0x

tool: D25: %02X

tool: D18: %d


assistant: ```c
void print_varbind(unsigned char *varbind, int vblen) {
  unsigned char *p = varbind;
  int i;
  int tag, len, val;
  p += 2;
  vblen -= 2;
  tag = p[0];
  len = p[1];
  p += 2;
  vblen -= 2;
  printf("%d.%d", *p / 40, *p % 40);
  val = 0;
  for (i = 1; i < len; i++) {
    val = (val * 128) + (p[i] & 127);
    if ((p[i] & 0x80) == 0) {
      printf(".%d", val);
      val = 0;
    }
  }
  printf("\t");
  p += len;
  tag = p[0];
  len = p[1];
  p += 2;
  vblen -= 2;
  if (tag == 4) {
    printf("0x");
    for (i = 0; i < len; i++) {
      printf("%02X", p[i]);
    }
    printf("\n");
  } else {
    val = 0;
    for (i = 0; i < len; i++) {
      val = (val * 128) + (p[i] & 127);
    }
    printf("%d\n", val);
  }
}
```