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

```asm
<shell_escape>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  movl   $0x0,-0xc(%rbp)
  movq   $0x0,-0x8(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  jne    L36
  mov    $0x0,%eax
  jmp    L13
L36:
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  cmp    %rax,-0x28(%rbp)
  ja     L5
  mov    D37(%rip),%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,-0xc(%rbp)
  jmp    L8
L5:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x27,(%rax)
L181:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  cmpb   $0x0,-0xd(%rbp)
  je     L75
  movsbl -0xd(%rbp),%eax
  cmp    $0x27,%eax
  je     L34
  cmp    $0x5c,%eax
  je     L182
  jmp    L151
L34:
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  cmp    %rax,-0x28(%rbp)
  ja     L166
  mov    D37(%rip),%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,-0xc(%rbp)
  jmp    L8
L166:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x27,(%rax)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x5c,(%rax)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x27,(%rax)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x27,(%rax)
  jmp    L45
L182:
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  cmp    %rax,-0x28(%rbp)
  ja     L78
  mov    D37(%rip),%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,-0xc(%rbp)
  jmp    L8
L78:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x5c,(%rax)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x5c,(%rax)
  jmp    L45
L151:
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  cmp    %rax,-0x28(%rbp)
  ja     L9
  mov    D37(%rip),%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,-0xc(%rbp)
  jmp    L8
L9:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rax,%rdx
  movzbl -0xd(%rbp),%eax
  mov    %al,(%rdx)
  nop
L45:
  jmp    L181
L75:
  nop
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  cmp    %rax,-0x28(%rbp)
  ja     L111
  mov    D37(%rip),%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,-0xc(%rbp)
  jmp    L8
L111:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x27,(%rax)
L8:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0xc(%rbp),%eax
L13:
  pop    %rbp
  ret
```

assistant: ```c
int shell_escape(const char *src, char *dst, size_t dst_len) {
  int ret = 0;
  size_t i = 0;
  if (dst_len == 0)
    return 0;
  if (i + 1 >= dst_len) {
    ret = -ENAMETOOLONG;
    goto done;
  }
  dst[i++] = '\'';
  while (1) {
    char c = *src++;
    if (c == '\0')
      break;
    switch (c) {
    case '\'':
      if (i + 4 >= dst_len) {
        ret = -ENAMETOOLONG;
        goto done;
      }
      dst[i++] = '\'';
      dst[i++] = '\\';
      dst[i++] = '\'';
      dst[i++] = '\'';
      break;
    case '\\':
      if (i + 2 >= dst_len) {
        ret = -ENAMETOOLONG;
        goto done;
      }
      dst[i++] = '\\';
      dst[i++] = '\\';
      break;
    default:
      if (i + 1 >= dst_len) {
        ret = -ENAMETOOLONG;
        goto done;
      }
      dst[i++] = c;
      break;
    }
  }
  if (i + 1 >= dst_len) {
    ret = -ENAMETOOLONG;
    goto done;
  }
  dst[i++] = '\'';
done:
  dst[i++] = '\0';
  return ret;
}
```