user: 请从给定的汇编指令推导出C源代码：

```asm
<dtn_strerror>:
  endbr64
  cmp    $0x8d,%edi
  jg     L20
  cmp    $0x80,%edi
  jle    L39
  sub    $0x82,%edi
  lea    D108(%rip),%rax
  cmp    $0xb,%edi
  ja     L7
  lea    D84(%rip),%rdx
  movslq (%rdx,%rdi,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  nopl   0x0(%rax,%rax,1)
L39:
  lea    D35(%rip),%rax
  cmp    $0xffffffff,%edi
  je     L7
  test   %edi,%edi
  jne    L20
  lea    D71(%rip),%rax
  ret
  nopl   0x0(%rax)
L7:
  ret
  nopl   0x0(%rax)
  lea    D146(%rip),%rax
  ret
  lea    D72(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D153(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D65(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D121(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D166(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D152(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D0(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D45(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D38(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D86(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D66(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
L20:
  push   %rbx
  lea    D53(%rip),%rbx
  mov    %edi,%ecx
  mov    $0x80,%esi
  mov    %rbx,%rdi
  lea    D5(%rip),%rdx
  call   <snprintf@plt>
  mov    %rbx,%rax
  pop    %rbx
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D108
data_type: string
name: extract_symbolic_data
arguments: label: D35
data_type: string
name: extract_symbolic_data
arguments: label: D71
data_type: string
name: extract_symbolic_data
arguments: label: D146
data_type: string
name: extract_symbolic_data
arguments: label: D72
data_type: string
name: extract_symbolic_data
arguments: label: D153
data_type: string
name: extract_symbolic_data
arguments: label: D65
data_type: string
name: extract_symbolic_data
arguments: label: D121
data_type: string
name: extract_symbolic_data
arguments: label: D166
data_type: string
name: extract_symbolic_data
arguments: label: D152
data_type: string
name: extract_symbolic_data
arguments: label: D0
data_type: string
name: extract_symbolic_data
arguments: label: D45
data_type: string
name: extract_symbolic_data
arguments: label: D38
data_type: string
name: extract_symbolic_data
arguments: label: D86
data_type: string
name: extract_symbolic_data
arguments: label: D66
data_type: string
name: extract_symbolic_data
arguments: label: D5
data_type: string

tool: D108: invalid argument

tool: D35: (invalid error code -1)

tool: D71: success

tool: D146: error in xdr routines

tool: D72: error in ipc communication

tool: D153: error connecting to server

tool: D65: operation timed out

tool: D121: payload too large

tool: D166: not found

tool: D152: internal error

tool: D0: illegal operation called after dtn_poll

tool: D45: registration already in use

tool: D38: ipc version mismatch

tool: D86: no storage space

tool: D66: unknown ipc message type

tool: D5: (unknown error %d)

assistant: ```c
char *dtn_strerror(int err) {
  switch (err) {
  case 0:
    return "success";
  case (128 + 1):
    return "invalid argument";
  case (128 + 2):
    return "error in xdr routines";
  case (128 + 3):
    return "error in ipc communication";
  case (128 + 4):
    return "error connecting to server";
  case (128 + 5):
    return "operation timed out";
  case (128 + 6):
    return "payload too large";
  case (128 + 7):
    return "not found";
  case (128 + 8):
    return "internal error";
  case (128 + 9):
    return "illegal operation called after dtn_poll";
  case (128 + 10):
    return "registration already in use";
  case (128 + 11):
    return "ipc version mismatch";
  case (128 + 12):
    return "unknown ipc message type";
  case (128 + 13):
    return "no storage space";
  case -1:
    return "(invalid error code -1)";
  }
  static char buf[128];
  snprintf(buf, sizeof(buf), "(unknown error %d)", err);
  return buf;
}
```