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

```asm
<ImaMashChannel>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %edi,0x4(%rsp)
  mov    %esi,0x8(%rsp)
  mov    %rdx,%r13
  mov    %ecx,0xc(%rsp)
  mov    %r8,0x18(%rsp)
  mov    %r9,0x28(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  cmpl   $0x0,0x80(%rsp)
  jg     L38
L76:
  movswl 0x0(%r13),%edx
  sub    $0x8,%rsp
  push   0x30(%rsp)
  mov    0x28(%rsp),%r9
  mov    0x1c(%rsp),%r8d
  mov    %r13,%rcx
  mov    0x18(%rsp),%esi
  mov    0x14(%rsp),%edi
  call   <ImaMashS@plt>
  add    $0x10,%rsp
  mov    0x38(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L113
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L38:
  mov    (%r8),%ebx
  mov    %ebx,0x24(%rsp)
  mov    %ebx,0x34(%rsp)
  movswl (%rdx),%edx
  sub    $0x8,%rsp
  push   $0x0
  lea    0x44(%rsp),%r9
  mov    %ecx,%r8d
  mov    %r13,%rcx
  call   <ImaMashS@plt>
  mov    %eax,0x30(%rsp)
  mov    %ebx,%r14d
  sub    0x90(%rsp),%r14d
  mov    $0x0,%eax
  cmovs  %eax,%r14d
  mov    %ebx,%ebp
  add    0x90(%rsp),%ebp
  mov    $0x58,%eax
  cmp    %eax,%ebp
  cmovg  %eax,%ebp
  add    $0x10,%rsp
  cmp    %r14d,%ebx
  setg   %al
  cmp    %ebp,%ebx
  jl     L102
  test   %al,%al
  je     L47
L102:
  mov    0x24(%rsp),%r15d
  mov    %r15d,%r12d
  mov    $0x0,%ebx
  lea    0x34(%rsp),%rdi
  mov    %rdi,0x10(%rsp)
  jmp    L74
L116:
  sub    $0x1,%r15d
  mov    %r15d,0x34(%rsp)
  movswl 0x0(%r13),%edx
  sub    $0x8,%rsp
  push   $0x0
  mov    0x20(%rsp),%r9
  mov    0x1c(%rsp),%r8d
  mov    %r13,%rcx
  mov    0x18(%rsp),%esi
  mov    0x14(%rsp),%edi
  call   <ImaMashS@plt>
  add    $0x10,%rsp
  cmp    0x20(%rsp),%eax
  jge    L71
  mov    %r15d,%r14d
  sub    0x80(%rsp),%r14d
  mov    $0x0,%edx
  cmovs  %edx,%r14d
  mov    %r15d,%ebp
  add    0x80(%rsp),%ebp
  mov    $0x58,%edx
  cmp    %edx,%ebp
  cmovg  %edx,%ebp
  mov    %eax,0x20(%rsp)
  mov    %r15d,0x24(%rsp)
L71:
  mov    $0x1,%eax
  sub    %ebx,%eax
  mov    %eax,%ebx
  cmp    %r15d,%r14d
  setl   %al
  cmp    %ebp,%r12d
  jl     L74
  test   %al,%al
  je     L47
L74:
  test   %ebx,%ebx
  jne    L121
  test   %al,%al
  jne    L116
L121:
  test   %ebx,%ebx
  je     L71
  cmp    %ebp,%r12d
  jge    L71
  add    $0x1,%r12d
  mov    %r12d,0x34(%rsp)
  movswl 0x0(%r13),%edx
  sub    $0x8,%rsp
  push   $0x0
  mov    0x20(%rsp),%r9
  mov    0x1c(%rsp),%r8d
  mov    %r13,%rcx
  mov    0x18(%rsp),%esi
  mov    0x14(%rsp),%edi
  call   <ImaMashS@plt>
  add    $0x10,%rsp
  cmp    0x20(%rsp),%eax
  jge    L71
  mov    %r12d,%r14d
  sub    0x80(%rsp),%r14d
  mov    $0x0,%edx
  cmovs  %edx,%r14d
  mov    %r12d,%ebp
  add    0x80(%rsp),%ebp
  mov    $0x58,%edx
  cmp    %edx,%ebp
  cmovg  %edx,%ebp
  mov    %eax,0x20(%rsp)
  mov    %r12d,0x24(%rsp)
  jmp    L71
L47:
  mov    0x18(%rsp),%rax
  mov    0x24(%rsp),%edi
  mov    %edi,(%rax)
  jmp    L76
L113:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void ImaMashChannel(unsigned ch, unsigned chans, const short *ip, int n, int *st, unsigned char *obuff, int opt) {
  int snext, d;
  int s0, d0;
  int s32, d32;
  s32 = s0 = *st;
  if (opt > 0) {
    int low, hi, w;
    int low0, hi0;
    snext = s0;
    d32 = d0 = ImaMashS(ch, chans, ip[0], ip, n, &snext, NULL);
    w = 0;
    low = hi = s0;
    low0 = low - opt;
    if (low0 < 0)
      low0 = 0;
    hi0 = hi + opt;
    if (hi0 > 88)
      hi0 = 88;
    while (low > low0 || hi < hi0) {
      if (!w && low > low0) {
        int d;
        snext = --low;
        d = ImaMashS(ch, chans, ip[0], ip, n, &snext, NULL);
        if (d < d0) {
          d0 = d;
          s0 = low;
          low0 = low - opt;
          if (low0 < 0)
            low0 = 0;
          hi0 = low + opt;
          if (hi0 > 88)
            hi0 = 88;
        }
      }
      if (w && hi < hi0) {
        int d;
        snext = ++hi;
        d = ImaMashS(ch, chans, ip[0], ip, n, &snext, NULL);
        if (d < d0) {
          d0 = d;
          s0 = hi;
          low0 = hi - opt;
          if (low0 < 0)
            low0 = 0;
          hi0 = hi + opt;
          if (hi0 > 88)
            hi0 = 88;
        }
      }
      w = 1 - w;
    }
    *st = s0;
  }
  d = ImaMashS(ch, chans, ip[0], ip, n, st, obuff);
}
```