user: 请将以下的汇编代码转换成C语言代码:

```asm
<escape_char>:
  endbr64
  push   %r15
  mov    %r9,%r15
  push   %r14
  push   %r13
  mov    %ecx,%r13d
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  mov    %rsi,%rdi
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x38,%rsp
  mov    %rdx,0x18(%rsp)
  mov    0x70(%rsp),%r12
  mov    %r8,0x8(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  call   <assert@plt>
  cmp    %rbp,%rbx
  je     L137
  xor    %r14d,%r14d
  test   %r13d,%r13d
  jne    L21
  lea    0x20(%rsp),%rax
  mov    %rax,0x10(%rsp)
  jmp    L209
  cs nopw 0x0(%rax,%rax,1)
L20:
  mov    D12(%rip),%rdx
  mov    %r13d,%esi
  shl    $0x8,%esi
  mov    (%rdx),%ecx
  mov    %r13d,%edx
  lea    (%rsi,%rax,1),%r13d
  mov    %ecx,%edi
  shr    $0x8,%edi
  cmp    %edx,%edi
  jb     L170
  sub    %eax,%ecx
  cmp    %esi,%ecx
  jae    L65
L170:
  mov    D8(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,(%r15)
L65:
  add    $0x1,%r14
  cmp    %rbx,%rbp
  je     L166
L209:
  movsbl 0x0(%rbp),%eax
  test   %al,%al
  je     L231
  add    $0x1,%rbp
  cmp    $0x5c,%al
  jne    L20
  cmp    %rbx,%rbp
  je     L185
  mov    0x10(%rsp),%rsi
  mov    %rbp,%rdi
  mov    %r12,%r8
  mov    %r15,%rcx
  xor    %edx,%edx
  call   <escape_char_1@plt>
  mov    0x20(%rsp),%rbp
  jmp    L20
  nopw   0x0(%rax,%rax,1)
L21:
  lea    0x20(%rsp),%rcx
  xor    %eax,%eax
  mov    %rcx,0x10(%rsp)
  jmp    L202
  xchg   %ax,%ax
L163:
  movsbl %dl,%eax
L139:
  test   %eax,%eax
  je     L41
  mov    D8(%rip),%rdx
  mov    (%rdx),%edx
  mov    %edx,(%r15)
L41:
  add    $0x1,%r14
  cmp    %rbp,%rbx
  je     L58
L202:
  movzbl 0x0(%rbp),%edx
  test   %dl,%dl
  je     L182
  add    $0x1,%rbp
  cmp    $0x5c,%dl
  jne    L163
  cmp    %rbp,%rbx
  je     L52
  mov    0x10(%rsp),%rsi
  mov    %rbp,%rdi
  mov    %r12,%r8
  mov    %r15,%rcx
  mov    %r13d,%edx
  call   <escape_char_1@plt>
  mov    0x20(%rsp),%rbp
  jmp    L139
L52:
  mov    %eax,%r13d
L185:
  mov    D20(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,(%r12)
L166:
  mov    %r13d,%eax
L58:
  cmpq   $0x0,0x8(%rsp)
  je     L71
L55:
  xor    %edx,%edx
  mov    0x8(%rsp),%rcx
  cmp    $0x1,%r14
  seta   %dl
  mov    %edx,(%rcx)
  cmp    %rbp,%rbx
  je     L71
L97:
  sub    $0x1,%rbp
L71:
  mov    0x18(%rsp),%rbx
  mov    %rbp,(%rbx)
  mov    0x28(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L46
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L231:
  mov    %r13d,%eax
L182:
  cmpq   $0x0,0x8(%rsp)
  jne    L55
  jmp    L97
L137:
  xor    %eax,%eax
  cmpq   $0x0,0x8(%rsp)
  je     L71
  mov    0x8(%rsp),%rax
  movl   $0x0,(%rax)
  xor    %eax,%eax
  jmp    L71
L46:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int escape_char(char *start, char *limit, char **const end, int is_wide, int *const multi, int *const warn, int *const err) {
  int ret = 0;
  char *i;
  size_t n = 0;
  assert(limit);
  for (i = start; i != limit && *i; i++) {
    int this;
    if (*i == '\\') {
      char *escfin;
      i++;
      if (i == limit) {
        *err = EILSEQ;
        break;
      }
      this = escape_char_1(i, &escfin, is_wide, warn, err);
      i = escfin - 1;
    } else {
      this = *i;
    }
    if (is_wide) {
      ret = this;
      if (ret)
        *warn = E2BIG;
    } else {
      int of = 0;
      if ((unsigned)ret > UINT_MAX / 256u)
        of = 1;
      ret *= 256u;
      if ((unsigned)ret > UINT_MAX - this)
        of = 1;
      ret += this;
      if (of)
        *warn = E2BIG;
    }
    n++;
  }
  if (multi)
    *multi = n > 1;
  if (i == limit)
    *end = i;
  else
    *end = i - 1;
  return ret;
}
```