user: Translate the below assembly code into C programming language:

```asm
<dStrHex>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  test   %esi,%esi
  jle    L47
  mov    %rdi,%r12
  mov    %esi,%ebp
  mov    %edx,%r14d
  lea    0x20(%rsp),%rdi
  mov    $0x50,%edx
  mov    $0x20,%esi
  call   <memset@plt>
  movb   $0x0,0x70(%rsp)
  test   %r14d,%r14d
  js     L151
  lea    0x21(%rsp),%rdi
  mov    $0x0,%edx
  lea    D40(%rip),%rsi
  call   <sprintf@plt>
  add    $0x1,%eax
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  lea    0x1(%r12),%r13
  movzbl (%r12),%ebx
  mov    %ebp,%ebp
  lea    (%r12,%rbp,1),%rax
  mov    %rax,0x10(%rsp)
  mov    $0x3c,%ebp
  movl   $0x0,0x1c(%rsp)
  mov    $0x8,%r12d
  lea    0x20(%rsp),%rax
  mov    %rax,0x8(%rsp)
  lea    D40(%rip),%r15
  jmp    L128
L75:
  mov    $0x5,%ebx
L45:
  cmp    $0x5,%ebx
  jle    L47
  lea    0x20(%rsp),%rsi
  lea    D57(%rip),%rdi
  call   <printf@plt>
  jmp    L47
L209:
  cmp    %r15,%rbp
  je     L45
  movzbl 0x1(%r12,%rbp,1),%edx
  add    $0x3,%ebx
  cmp    $0x20,%ebx
  mov    $0x21,%eax
  cmove  %eax,%ebx
L34:
  add    $0x1,%rbp
L152:
  movzbl %dl,%edx
  movslq %ebx,%rdi
  add    %r13,%rdi
  mov    %r14,%rsi
  call   <sprintf@plt>
  lea    0x2(%rbx),%eax
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  test   %ebp,%ebp
  jle    L209
  lea    0x1(%rbp),%eax
  test   $0xf,%al
  jne    L209
  mov    %r13,%rsi
  lea    D57(%rip),%rdi
  call   <printf@plt>
  mov    $0x50,%edx
  mov    $0x20,%esi
  mov    %r13,%rdi
  call   <memset@plt>
  cmp    %r15,%rbp
  je     L75
  movzbl 0x1(%r12,%rbp,1),%edx
  mov    $0x8,%ebx
  jmp    L34
L142:
  lea    -0x20(%rbx),%edx
  cmp    $0x5f,%dl
  mov    $0x2e,%ecx
  cmovae %ecx,%ebx
  lea    0x1(%rbp),%edx
  jmp    L112
L186:
  mov    0x8(%rsp),%rbp
  mov    %rbp,%rsi
  lea    D64(%rip),%rdi
  call   <printf@plt>
  addl   $0x10,0x1c(%rsp)
  mov    0x1c(%rsp),%ebx
  mov    $0x50,%edx
  mov    $0x20,%esi
  mov    %rbp,%rdi
  call   <memset@plt>
  lea    0x21(%rsp),%rdi
  mov    %ebx,%edx
  mov    %r15,%rsi
  call   <sprintf@plt>
  add    $0x1,%eax
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  cmp    %r13,0x10(%rsp)
  je     L114
  add    $0x1,%r13
  movzbl -0x1(%r13),%ebx
  mov    $0x3c,%ebp
  mov    $0x8,%r12d
L128:
  movzbl %bl,%edx
  movslq %r12d,%rdi
  add    0x8(%rsp),%rdi
  mov    %r15,%rsi
  call   <sprintf@plt>
  lea    0x2(%r12),%eax
  test   %r14d,%r14d
  je     L142
  lea    0x1(%rbp),%edx
  mov    $0x20,%ebx
L112:
  cltq
  movb   $0x20,0x20(%rsp,%rax,1)
  movslq %ebp,%rbp
  mov    %bl,0x20(%rsp,%rbp,1)
  cmp    $0x4b,%edx
  jg     L186
  cmp    %r13,0x10(%rsp)
  je     L49
  add    $0x1,%r13
  movzbl -0x1(%r13),%ebx
  add    $0x3,%r12d
  mov    %edx,%ebp
  cmp    $0x20,%r12d
  jne    L128
  mov    $0x21,%r12d
  jmp    L128
L114:
  mov    $0x3c,%edx
L49:
  cmp    $0x3c,%edx
  jg     L171
L47:
  mov    0x78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L62
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L171:
  lea    0x20(%rsp),%rsi
  lea    D64(%rip),%rdi
  call   <printf@plt>
  jmp    L47
L151:
  movzbl (%r12),%edx
  lea    -0x1(%rbp),%r15d
  mov    $0x0,%ebp
  mov    $0x8,%ebx
  lea    0x20(%rsp),%r13
  lea    D40(%rip),%r14
  jmp    L152
L62:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D40
datatype: string
name: retrieve_data
arguments: data_label: D57
datatype: string
name: retrieve_data
arguments: data_label: D64
datatype: string

tool: D40: %.2x

tool: D57: %.60s


tool: D64: %.76s


assistant: ```c
void dStrHex(const char *str, int len, int no_ascii) {
  const char *p = str;
  unsigned char c;
  char buff[82];
  int a = 0;
  const int bpstart = 5;
  const int cpstart = 60;
  int cpos = cpstart;
  int bpos = bpstart;
  int i, k;
  if (len <= 0)
    return;
  memset(buff, ' ', 80);
  buff[80] = '\0';
  if (no_ascii < 0) {
    for (k = 0; k < len; k++) {
      c = *p++;
      bpos += 3;
      if (bpos == (bpstart + (9 * 3)))
        bpos++;
      sprintf(&buff[bpos], "%.2x", (int)(unsigned char)c);
      buff[bpos + 2] = ' ';
      if ((k > 0) && (0 == ((k + 1) % 16))) {
        printf("%.60s\n", buff);
        bpos = bpstart;
        memset(buff, ' ', 80);
      }
    }
    if (bpos > bpstart)
      printf("%.60s\n", buff);
    return;
  }
  k = sprintf(buff + 1, "%.2x", a);
  buff[k + 1] = ' ';
  for (i = 0; i < len; i++) {
    c = *p++;
    bpos += 3;
    if (bpos == (bpstart + (9 * 3)))
      bpos++;
    sprintf(&buff[bpos], "%.2x", (int)(unsigned char)c);
    buff[bpos + 2] = ' ';
    if (no_ascii)
      buff[cpos++] = ' ';
    else {
      if ((c < ' ') || (c >= 0x7f))
        c = '.';
      buff[cpos++] = c;
    }
    if (cpos > (cpstart + 15)) {
      printf("%.76s\n", buff);
      bpos = bpstart;
      cpos = cpstart;
      a += 16;
      memset(buff, ' ', 80);
      k = sprintf(buff + 1, "%.2x", a);
      buff[k + 1] = ' ';
    }
  }
  if (cpos > cpstart)
    printf("%.76s\n", buff);
}
```