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

```asm
<PB_Cg2lrem>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  mov    %edx,-0x1c(%rbp)
  mov    %ecx,-0x20(%rbp)
  mov    %r8d,-0x24(%rbp)
  mov    %r9d,-0x28(%rbp)
  cmpl   $0xffffffff,-0x24(%rbp)
  je     L110
  cmpl   $0x1,-0x28(%rbp)
  jne    L243
L110:
  mov    -0x14(%rbp),%eax
  jmp    L205
L243:
  mov    -0x14(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jge    L231
  mov    -0x20(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jne    L96
  mov    -0x14(%rbp),%eax
  jmp    L205
L96:
  mov    $0x0,%eax
  jmp    L205
L231:
  mov    -0x20(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jne    L118
  mov    -0x14(%rbp),%eax
  sub    -0x18(%rbp),%eax
  cltd
  idivl  -0x1c(%rbp)
  add    $0x1,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jge    L177
  mov    -0x18(%rbp),%eax
  jmp    L205
L177:
  mov    -0x24(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  cltd
  idivl  -0x28(%rbp)
  mov    %edx,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  cltd
  idivl  -0x28(%rbp)
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  imul   -0x28(%rbp),%eax
  cmp    %eax,-0xc(%rbp)
  jg     L211
  mov    -0x20(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jne    L142
  mov    -0x4(%rbp),%eax
  sub    -0xc(%rbp),%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  jmp    L205
L142:
  mov    -0x4(%rbp),%eax
  sub    $0x1,%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  jmp    L205
L211:
  mov    -0x4(%rbp),%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  jmp    L205
L118:
  mov    -0x18(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x1c(%rbp)
  add    $0x1,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x24(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  cltd
  idivl  -0x28(%rbp)
  mov    %edx,-0x8(%rbp)
  mov    -0x20(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jns    L25
  mov    -0x28(%rbp),%eax
  add    %eax,-0x10(%rbp)
L25:
  mov    -0xc(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jge    L256
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x10(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  js     L119
  mov    -0x20(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jne    L227
  mov    $0x1,%eax
  sub    -0xc(%rbp),%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  jmp    L205
L227:
  mov    $0x0,%eax
  jmp    L205
L119:
  mov    -0x1c(%rbp),%eax
  jmp    L205
L256:
  mov    -0xc(%rbp),%eax
  cltd
  idivl  -0x28(%rbp)
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  imul   -0x28(%rbp),%eax
  mov    %eax,%edx
  mov    -0xc(%rbp),%eax
  sub    %edx,%eax
  sub    %eax,-0x10(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jns    L26
  mov    -0x4(%rbp),%eax
  add    $0x1,%eax
  imul   -0x1c(%rbp),%eax
  jmp    L5
L26:
  mov    -0x20(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jne    L144
  mov    -0x4(%rbp),%eax
  sub    -0xc(%rbp),%eax
  add    $0x1,%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  jmp    L5
L144:
  mov    -0x4(%rbp),%eax
  imul   -0x1c(%rbp),%eax
L5:
  nop
L205:
  pop    %rbp
  ret
```

assistant: ```c
int PB_Cg2lrem(int IG, int INB, int NB, int MYPROC, int SRCPROC, int NPROCS) {
  int ilocblk, mydist, nblocks, proc;
  if ((SRCPROC == -1) || (NPROCS == 1))
    return (IG);
  if (IG < INB)
    return ((MYPROC == SRCPROC ? IG : 0));
  if (MYPROC == SRCPROC) {
    nblocks = (IG - INB) / NB + 1;
    if (nblocks < NPROCS)
      return (INB);
    proc = SRCPROC + nblocks;
    proc -= (proc / NPROCS) * NPROCS;
    ilocblk = nblocks / NPROCS;
    if (ilocblk * NPROCS >= nblocks)
      return (((MYPROC == proc) ? IG + (ilocblk - nblocks) * NB : INB + (ilocblk - 1) * NB));
    else
      return (INB + ilocblk * NB);
  } else {
    nblocks = (IG -= INB) / NB + 1;
    proc = SRCPROC + nblocks;
    proc -= (proc / NPROCS) * NPROCS;
    if ((mydist = MYPROC - SRCPROC) < 0)
      mydist += NPROCS;
    if (nblocks < NPROCS) {
      mydist -= nblocks;
      return (((mydist < 0) ? NB : ((MYPROC == proc) ? IG + (1 - nblocks) * NB : 0)));
    } else {
      ilocblk = nblocks / NPROCS;
      mydist -= nblocks - ilocblk * NPROCS;
      return (((mydist < 0) ? (ilocblk + 1) * NB : ((MYPROC == proc) ? (ilocblk - nblocks + 1) * NB + IG : ilocblk * NB)));
    }
  }
}
```