user: 下面的汇编指令对应的C源代码是什么:

```asm
<print_raw_data>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    -0x44(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x1c(%rbp)
  mov    -0x38(%rbp),%rax
  lea    D64(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L112
L64:
  mov    -0x28(%rbp),%edx
  mov    -0x38(%rbp),%rax
  lea    D95(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  addl   $0x10,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L62
L124:
  movl   $0x0,-0x20(%rbp)
  jmp    L45
L133:
  mov    -0x18(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jae    L55
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x38(%rbp),%rax
  lea    D15(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L106
L55:
  mov    -0x38(%rbp),%rax
  lea    D39(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
L106:
  addl   $0x1,-0x20(%rbp)
L45:
  cmpl   $0x3,-0x20(%rbp)
  jle    L133
  mov    -0x38(%rbp),%rax
  lea    D77(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  addl   $0x1,-0x24(%rbp)
L62:
  cmpl   $0x3,-0x24(%rbp)
  jle    L124
  mov    -0x38(%rbp),%rax
  lea    D28(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L85
L118:
  mov    -0x10(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jae    L39
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x1f,%al
  jle    L82
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7f,%al
  je     L82
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x38(%rbp),%rax
  lea    D32(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L17
L82:
  mov    -0x38(%rbp),%rax
  lea    D29(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
L17:
  addq   $0x1,-0x10(%rbp)
  jmp    L98
L39:
  mov    -0x38(%rbp),%rax
  lea    D77(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
L98:
  addl   $0x1,-0x24(%rbp)
L85:
  cmpl   $0xf,-0x24(%rbp)
  jle    L118
  mov    -0x38(%rbp),%rax
  lea    D60(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
L112:
  mov    -0x18(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jb     L64
  mov    -0x1c(%rbp),%eax
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D64
data_type: string
name: extract_symbolic_data
arguments: tag: D95
data_type: string
name: extract_symbolic_data
arguments: tag: D15
data_type: string
name: extract_symbolic_data
arguments: tag: D39
data_type: string
name: extract_symbolic_data
arguments: tag: D77
data_type: string
name: extract_symbolic_data
arguments: tag: D28
data_type: string
name: extract_symbolic_data
arguments: tag: D32
data_type: string
name: extract_symbolic_data
arguments: tag: D29
data_type: string
name: extract_symbolic_data
arguments: tag: D60
data_type: string

tool: D64: 


tool: D95: 0x%04x:  

tool: D15: %02x

tool: D39:   

tool: D77:  

tool: D28:     [

tool: D32: %c

tool: D29: .

tool: D60: ]


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;
}
```