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

```asm
<print_raw_data>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%r13
  mov    %rsi,%r15
  movslq %edx,%rax
  lea    (%rsi,%rax,1),%r14
  lea    D86(%rip),%rsi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%ebx
  cmp    %r14,%r15
  jae    L127
  mov    %r15,%r12
  movl   $0x0,0x4(%rsp)
  mov    %r13,%rbp
  jmp    L55
L43:
  lea    D9(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    %eax,%r12d
L97:
  sub    $0x1,%ebx
  je     L28
L105:
  cmp    %r15,%r14
  jbe    L43
  lea    0x1(%r15),%r13
  movsbl (%r15),%edx
  lea    D47(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    %eax,%r12d
  mov    %r13,%r15
  jmp    L97
L28:
  lea    D79(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  lea    (%r12,%rax,1),%r13d
  mov    %r13d,%r12d
  subl   $0x1,(%rsp)
  je     L1
L59:
  mov    $0x4,%ebx
  jmp    L105
L1:
  mov    0x8(%rsp),%r12
  lea    D19(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    %eax,%r13d
  mov    $0x10,%ebx
  jmp    L121
L50:
  lea    D92(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    %eax,%r13d
L19:
  add    $0x1,%r12
L40:
  sub    $0x1,%ebx
  je     L15
L121:
  cmp    %r12,%r14
  jbe    L9
  movzbl (%r12),%edx
  lea    -0x20(%rdx),%eax
  cmp    $0x5e,%al
  ja     L50
  movsbl %dl,%edx
  lea    D98(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    %eax,%r13d
  jmp    L19
L9:
  lea    D79(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    %eax,%r13d
  jmp    L40
L15:
  lea    D27(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  lea    0x0(%r13,%rax,1),%ebx
  cmp    %r14,%r15
  jae    L127
L55:
  mov    0x4(%rsp),%r13d
  mov    %r13d,%edx
  lea    D26(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    %ebx,%eax
  add    $0x10,%r13d
  mov    %r13d,0x4(%rsp)
  movl   $0x4,(%rsp)
  mov    %r12,0x8(%rsp)
  mov    %eax,%r12d
  jmp    L59
L127:
  mov    %ebx,%eax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: retrieve_data
arguments: label: D86
data_type: string
name: retrieve_data
arguments: label: D9
data_type: string
name: retrieve_data
arguments: label: D47
data_type: string
name: retrieve_data
arguments: label: D79
data_type: string
name: retrieve_data
arguments: label: D19
data_type: string
name: retrieve_data
arguments: label: D92
data_type: string
name: retrieve_data
arguments: label: D98
data_type: string
name: retrieve_data
arguments: label: D27
data_type: string
name: retrieve_data
arguments: label: D26
data_type: string

tool: D86: 


tool: D9:   

tool: D47: %02x

tool: D79:  

tool: D19:     [

tool: D92: .

tool: D98: %c

tool: D27: ]


tool: D26: 0x%04x:  

assistant: ```c
int print_raw_data(FILE *ostream, char *data, int data_len) {
  char *h, *a;
  char *end = data + data_len;
  unsigned int offset = 0;
  int i, j;
  int len = 0;
  len += fprintf(ostream, "\n");
  h = a = data;
  while (h < end) {
    len += fprintf(ostream, "0x%04x:  ", offset);
    offset += 16;
    for (i = 0; i < 4; i++) {
      for (j = 0; j < 4; j++) {
        if (h < end)
          len += fprintf(ostream, "%02x", *h++);
        else
          len += fprintf(ostream, "  ");
      }
      len += fprintf(ostream, " ");
    }
    len += fprintf(ostream, "    [");
    for (i = 0; i < 16; i++) {
      if (a < end) {
        if ((*a >= ' ') && (*a <= '~'))
          len += fprintf(ostream, "%c", *a);
        else
          len += fprintf(ostream, ".");
        a++;
      } else
        len += fprintf(ostream, " ");
    }
    len += fprintf(ostream, "]\n");
  }
  return len;
}
```