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

```asm
<escape_character>:
  endbr64
  push   %r12
  mov    %rsi,%r12
  cmp    $0x27,%dil
  jg     L104
  test   %dil,%dil
  js     L32
  cmp    $0x27,%dil
  ja     L32
  lea    D104(%rip),%rdx
  movzbl %dil,%eax
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  nop
L104:
  cmp    $0x5c,%dil
  jne    L32
  mov    $0x5,%edx
  lea    D36(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
L120:
  mov    %r12,%rax
  movb   $0x0,0x4(%r12)
  pop    %r12
  ret
  cs nopw 0x0(%rax,%rax,1)
L32:
  movzbl %dil,%ecx
  sub    $0x20,%edi
  cmp    $0x5e,%dil
  ja     L77
  lea    D124(%rip),%rdx
  mov    $0x5,%esi
  mov    %r12,%rdi
  call   <snprintf@plt>
  jmp    L120
  nopw   0x0(%rax,%rax,1)
  mov    $0x5,%edx
  lea    D49(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  cs nopw 0x0(%rax,%rax,1)
  mov    $0x5,%edx
  lea    D95(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  cs nopw 0x0(%rax,%rax,1)
  mov    $0x5,%edx
  lea    D110(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
  mov    $0x5,%edx
  lea    D68(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
  mov    $0x5,%edx
  lea    D82(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
  mov    $0x5,%edx
  lea    D29(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
  mov    $0x5,%edx
  lea    D47(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
  mov    $0x5,%edx
  lea    D105(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
  mov    $0x5,%edx
  lea    D96(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
  mov    $0x5,%edx
  lea    D4(%rip),%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  jmp    L120
  nopl   0x0(%rax)
L77:
  lea    D108(%rip),%rdx
  mov    $0x5,%esi
  mov    %r12,%rdi
  call   <snprintf@plt>
  jmp    L120
```

tool_calls: name: unpack_data
arguments: label: D36
type: string
name: unpack_data
arguments: label: D124
type: string
name: unpack_data
arguments: label: D49
type: string
name: unpack_data
arguments: label: D95
type: string
name: unpack_data
arguments: label: D110
type: string
name: unpack_data
arguments: label: D68
type: string
name: unpack_data
arguments: label: D82
type: string
name: unpack_data
arguments: label: D29
type: string
name: unpack_data
arguments: label: D47
type: string
name: unpack_data
arguments: label: D105
type: string
name: unpack_data
arguments: label: D96
type: string
name: unpack_data
arguments: label: D4
type: string
name: unpack_data
arguments: label: D108
type: string

tool: D36: \\

tool: D124: %c

tool: D49: \0

tool: D95: \a

tool: D110: \b

tool: D68: \t

tool: D82: \n

tool: D29: \v

tool: D47: \f

tool: D105: \r

tool: D96: \"

tool: D4: \'

tool: D108: \x%02x

assistant: ```c
const char *escape_character(char ch, char (*buf)[5]) {
  switch (ch) {
  case '\x00':
    strncpy(*buf, "\\0", 5);
    break;
  case '\x07':
    strncpy(*buf, "\\a", 5);
    break;
  case '\x08':
    strncpy(*buf, "\\b", 5);
    break;
  case '\x0c':
    strncpy(*buf, "\\f", 5);
    break;
  case '\x0a':
    strncpy(*buf, "\\n", 5);
    break;
  case '\x0d':
    strncpy(*buf, "\\r", 5);
    break;
  case '\x09':
    strncpy(*buf, "\\t", 5);
    break;
  case '\x0b':
    strncpy(*buf, "\\v", 5);
    break;
  case '\\':
    strncpy(*buf, "\\\\", 5);
    break;
  case '\'':
    strncpy(*buf, "\\\'", 5);
    break;
  case '\"':
    strncpy(*buf, "\\\"", 5);
    break;
  default:
    if (ch >= '\x20' && ch < '\x7f')
      snprintf(*buf, 5, "%c", ch);
    else
      snprintf(*buf, 5, "\\x%02x", (unsigned char)ch);
  }
  (*buf)[4] = '\0';
  return (char *)buf;
}
```