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

```asm
<pbchkvect>:
  endbr64
  push   %r15
  mov    %edi,%r11d
  mov    %ecx,%r10d
  mov    $0x2710,%eax
  push   %r14
  push   %r13
  push   %r12
  mov    %esi,%r12d
  mov    %edx,%esi
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    0x98(%rsp),%rbx
  mov    (%rbx),%edx
  test   %edx,%edx
  js     L94
L90:
  mov    0x50(%rsp),%edi
  mov    %eax,(%rbx)
  lea    -0x2(%rdi),%edx
  imul   $0x64,%edx,%edx
  cmpl   $0x1,(%r8)
  lea    0x64(%rdx),%edi
  lea    0xc9(%rdx),%ebp
  je     L381
  cmp    %ebp,%eax
  cmovg  %ebp,%eax
  mov    %eax,(%rbx)
L381:
  test   %r11d,%r11d
  js     L320
  test   %esi,%esi
  jle    L501
  test   %r10d,%r10d
  jle    L89
  mov    0x10(%r8),%r14d
  test   %r14d,%r14d
  jle    L481
  mov    0x14(%r8),%r13d
  test   %r13d,%r13d
  jle    L539
  mov    0x18(%r8),%ecx
  test   %ecx,%ecx
  js     L229
  cmp    0x78(%rsp),%ecx
  jge    L229
  mov    0x1c(%r8),%ecx
  test   %ecx,%ecx
  js     L423
  cmp    0x80(%rsp),%ecx
  jge    L423
  cmp    $0x1,%r9d
  je     L7
  cmp    %r9d,0x8(%r8)
  je     L7
  lea    0x12c(%rdx),%ecx
  cmp    %ecx,%eax
  cmovg  %ecx,%eax
  mov    %eax,(%rbx)
  jmp    L406
  nopl   0x0(%rax,%rax,1)
L501:
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    %eax,(%rbx)
L406:
  mov    0x8(%r8),%ecx
  test   %r11d,%r11d
  jne    L80
  test   %ecx,%ecx
  jns    L55
  lea    0xca(%rdx),%edi
  lea    0xcb(%rdx),%ecx
  cmp    %eax,%edi
  cmovl  %ecx,%eax
  mov    %eax,(%rbx)
L55:
  mov    0xc(%r8),%ecx
  test   %ecx,%ecx
  js     L266
L422:
  cmp    $0x2710,%eax
  je     L83
L51:
  imul   $0xc28f5c29,%eax,%edx
  mov    %eax,%ecx
  neg    %ecx
  add    $0x51eb850,%edx
  ror    $0x2,%edx
  cmp    $0x28f5c28,%edx
  ja     L290
  movslq %eax,%rdx
  sar    $0x1f,%eax
  imul   $0x51eb851f,%rdx,%rdx
  sar    $0x25,%rdx
  sub    %edx,%eax
  mov    %eax,%ecx
L290:
  mov    %ecx,(%rbx)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L320:
  imul   $0x64,%r12d,%r12d
  cmp    %r12d,%eax
  cmovg  %r12d,%eax
  mov    %eax,(%rbx)
  mov    0x8(%r8),%ecx
L80:
  test   %ecx,%ecx
  jle    L438
  mov    0xc(%r8),%r12d
  test   %r12d,%r12d
  jle    L266
  cmp    %r9d,%ecx
  je     L79
L310:
  cmp    $0x1,%r9d
  jne    L17
  cmp    $0x1,%ecx
  jne    L161
L17:
  cmp    %esi,%ecx
  jl     L495
  cmp    %r10d,%r12d
  jge    L422
L158:
  cmp    %edi,%eax
  cmovg  %edi,%eax
  mov    %eax,(%rbx)
  jmp    L422
  nop
L266:
  lea    0xcb(%rdx),%ecx
  add    $0xcc,%edx
  cmp    %eax,%ecx
  cmovl  %edx,%eax
  mov    %eax,(%rbx)
  cmp    $0x2710,%eax
  jne    L51
L83:
  mov    0x78(%rsp),%eax
  mov    0x14(%r8),%r11d
  sub    $0x1,%esi
  sub    $0x1,%r10d
  add    0x88(%rsp),%eax
  sub    0x18(%r8),%eax
  cltd
  mov    0x80(%rsp),%r9d
  mov    0x90(%rsp),%r15d
  idivl  0x78(%rsp)
  mov    0x10(%r8),%r12d
  lea    (%r15,%r9,1),%eax
  sub    0x1c(%r8),%eax
  mov    %edx,%r14d
  cltd
  idiv   %r9d
  mov    0xc(%r8),%eax
  mov    %edx,%r13d
  cltd
  idiv   %r11d
  mov    %eax,%ecx
  mov    0x8(%r8),%eax
  cltd
  idiv   %r12d
  cltd
  idivl  0x78(%rsp)
  imul   %r12d,%eax
  mov    %edx,0x8(%rsp)
  mov    %eax,%edi
  mov    %ecx,%eax
  cltd
  idiv   %r9d
  mov    %eax,%ecx
  mov    %esi,%eax
  mov    %edx,0xc(%rsp)
  cltd
  imul   %r11d,%ecx
  idiv   %r12d
  mov    %eax,%r12d
  mov    %r10d,%eax
  cltd
  idiv   %r11d
  mov    %eax,%r11d
  mov    0x18(%r8),%eax
  add    %r12d,%eax
  cltd
  idivl  0x78(%rsp)
  mov    0x68(%rsp),%rax
  mov    %edx,(%rax)
  mov    0x1c(%r8),%eax
  add    %r11d,%eax
  cltd
  idiv   %r9d
  mov    0x70(%rsp),%rax
  mov    %edx,(%rax)
  mov    %r12d,%eax
  cltd
  idivl  0x78(%rsp)
  add    $0x1,%eax
  imul   0x10(%r8),%eax
  mov    %edx,%r12d
  mov    0x58(%rsp),%rdx
  add    $0x1,%eax
  mov    %eax,(%rdx)
  mov    %r11d,%eax
  cltd
  idiv   %r9d
  add    $0x1,%eax
  imul   0x14(%r8),%eax
  mov    %edx,%r11d
  mov    0x60(%rsp),%rdx
  add    $0x1,%eax
  mov    %eax,(%rdx)
  cmp    %r14d,%r12d
  jg     L54
  mov    0x58(%rsp),%rax
  mov    0x88(%rsp),%edx
  mov    (%rax),%r9d
  mov    0x68(%rsp),%rax
  cmp    %edx,(%rax)
  jne    L313
  mov    %esi,%eax
  cltd
  idivl  0x10(%r8)
  mov    0x58(%rsp),%rax
  add    %edx,%r9d
  mov    %r9d,(%rax)
L313:
  mov    0x58(%rsp),%rax
  sub    0x10(%r8),%r9d
  mov    %r9d,(%rax)
L54:
  cmp    0x8(%rsp),%r14d
  jl     L392
  jne    L536
  mov    0x8(%r8),%eax
  cltd
  idivl  0x10(%r8)
  add    %edx,%edi
  nopl   0x0(%rax,%rax,1)
L536:
  test   %edi,%edi
  mov    $0x1,%esi
  cmovg  %edi,%esi
  cmp    %r13d,%r11d
  jg     L191
  mov    0x60(%rsp),%rax
  mov    (%rax),%edi
  mov    0x70(%rsp),%rax
  cmp    (%rax),%r15d
  jne    L441
  mov    %r10d,%eax
  cltd
  idivl  0x14(%r8)
  mov    0x60(%rsp),%rax
  add    %edx,%edi
  mov    %edi,(%rax)
L441:
  mov    0x60(%rsp),%rax
  sub    0x14(%r8),%edi
  mov    %edi,(%rax)
L191:
  cmp    0xc(%rsp),%r13d
  jge    L335
  add    0x14(%r8),%ecx
L43:
  mov    0x58(%rsp),%rax
  mov    0x58(%rsp),%rdi
  mov    (%rax),%eax
  cmp    %esi,%eax
  cmovg  %esi,%eax
  test   %ecx,%ecx
  mov    %eax,(%rdi)
  mov    $0x1,%eax
  cmovle %eax,%ecx
  mov    0x60(%rsp),%rax
  mov    (%rax),%eax
  cmp    %eax,%ecx
  cmovg  %eax,%ecx
  mov    0x60(%rsp),%rax
  mov    %ecx,(%rax)
  cmp    %esi,0x20(%r8)
  jl     L321
L178:
  xor    %ecx,%ecx
  jmp    L290
  nopl   0x0(%rax,%rax,1)
L94:
  cmp    $0xffffff9c,%edx
  jge    L104
  mov    %edx,%eax
  neg    %eax
  jmp    L90
  xchg   %ax,%ax
L438:
  lea    0xca(%rdx),%ecx
  add    $0xcb,%edx
  cmp    %eax,%ecx
  cmovl  %edx,%eax
  mov    %eax,(%rbx)
  jmp    L422
  nopl   0x0(%rax,%rax,1)
L104:
  imul   $0xffffff9c,%edx,%eax
  jmp    L90
  nopl   0x0(%rax,%rax,1)
L392:
  add    0x10(%r8),%edi
  jmp    L536
  nopl   0x0(%rax)
L321:
  lea    0x1c(%r8),%rcx
  lea    0x14(%r8),%rsi
  xor    %eax,%eax
  lea    0xc(%r8),%rdi
  lea    0x90(%rsp),%rdx
  lea    0x80(%rsp),%r8
  call   <numroc_@plt>
  test   %eax,%eax
  je     L178
  mov    $0xfffffff8,%ecx
  sub    %ebp,%ecx
  jmp    L290
  nopw   0x0(%rax,%rax,1)
L481:
  lea    0xcc(%rdx),%r12d
  lea    0xcd(%rdx),%ecx
  cmp    %eax,%r12d
  cmovl  %ecx,%eax
  mov    %eax,(%rbx)
  jmp    L406
  nopw   0x0(%rax,%rax,1)
L229:
  lea    0xce(%rdx),%r12d
  lea    0xcf(%rdx),%ecx
  cmp    %eax,%r12d
  cmovl  %ecx,%eax
  mov    %eax,(%rbx)
  jmp    L406
  nopw   0x0(%rax,%rax,1)
L335:
  jne    L43
  mov    0xc(%r8),%eax
  cltd
  idivl  0x14(%r8)
  add    %edx,%ecx
  jmp    L43
  cs nopw 0x0(%rax,%rax,1)
L89:
  cmp    %edi,%eax
  cmovg  %edi,%eax
  mov    %eax,(%rbx)
  jmp    L406
  nopl   0x0(%rax)
L161:
  lea    -0x1(%r11,%rsi,1),%r9d
  cmp    %r9d,%ecx
  jge    L17
L495:
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    %eax,(%rbx)
  jmp    L422
  nopw   0x0(%rax,%rax,1)
L79:
  lea    -0x1(%r11,%r10,1),%r13d
  cmp    %r13d,%r12d
  jge    L310
  jmp    L158
  nopl   0x0(%rax,%rax,1)
L539:
  lea    0xcd(%rdx),%r12d
  lea    0xce(%rdx),%ecx
  cmp    %eax,%r12d
  cmovl  %ecx,%eax
  mov    %eax,(%rbx)
  jmp    L406
  nopw   0x0(%rax,%rax,1)
L423:
  lea    0xcf(%rdx),%r12d
  lea    0xd0(%rdx),%ecx
  cmp    %eax,%r12d
  cmovl  %ecx,%eax
  mov    %eax,(%rbx)
  jmp    L406
L7:
  mov    0x20(%r8),%r12d
  test   %r12d,%r12d
  jg     L406
  lea    0xd0(%rdx),%r12d
  lea    0xd1(%rdx),%ecx
  cmp    %eax,%r12d
  cmovl  %ecx,%eax
  mov    %eax,(%rbx)
  jmp    L406
```

assistant: ```c
void pbchkvect(n, npos0, ix, jx, desc_X, incx, dpos0, iix, jjx, ixrow, ixcol, nprow, npcol, myrow, mycol, info) int dpos0, *iix, incx, *info, ix, *ixcol, *ixrow, *jjx, jx, myrow, mycol, npcol, nprow, n, npos0;
int desc_X[];
{
  int descpos, ExtraColBlock, ExtraRowBlock, icpos, ixpos, jxpos, MyColBlock, MyColDist, MyRowBlock, MyRowDist, NColBlock, np, npos, nq, NRowBlock;
  int numroc_();
  if (*info >= 0)
    *info = 10000;
  else if (*info < -100)
    *info = -(*info);
  else
    *info = -(*info) * 100;
  npos = npos0 * 100;
  ixpos = (dpos0 - 2) * 100;
  jxpos = (dpos0 - 1) * 100;
  icpos = (dpos0 + 1) * 100;
  descpos = dpos0 * 100 + 1;
  if (desc_X[0] != 1)
    *info = (((*info) < (descpos + 0)) ? (*info) : (descpos + 0));
  if (n < 0)
    *info = (((*info) < (npos)) ? (*info) : (npos));
  else if (ix < 1)
    *info = (((*info) < (ixpos)) ? (*info) : (ixpos));
  else if (jx < 1)
    *info = (((*info) < (jxpos)) ? (*info) : (jxpos));
  else if (desc_X[4] < 1)
    *info = (((*info) < (descpos + 4)) ? (*info) : (descpos + 4));
  else if (desc_X[5] < 1)
    *info = (((*info) < (descpos + 5)) ? (*info) : (descpos + 5));
  else if ((desc_X[6] < 0) || (desc_X[6] >= nprow))
    *info = (((*info) < (descpos + 6)) ? (*info) : (descpos + 6));
  else if ((desc_X[7] < 0) || (desc_X[7] >= npcol))
    *info = (((*info) < (descpos + 7)) ? (*info) : (descpos + 7));
  else if (incx != 1 && incx != desc_X[2])
    *info = (((*info) < (icpos)) ? (*info) : (icpos));
  else if (desc_X[8] < 1)
    *info = (((*info) < (descpos + 8)) ? (*info) : (descpos + 8));
  if (n == 0) {
    if (desc_X[2] < 0)
      *info = (((*info) < (descpos + 2)) ? (*info) : (descpos + 2));
    if (desc_X[3] < 0)
      *info = (((*info) < (descpos + 3)) ? (*info) : (descpos + 3));
  } else {
    if (desc_X[2] < 1)
      *info = (((*info) < (descpos + 2)) ? (*info) : (descpos + 2));
    else if (desc_X[3] < 1)
      *info = (((*info) < (descpos + 3)) ? (*info) : (descpos + 3));
    else if ((incx == desc_X[2]) && (jx + n - 1 > desc_X[3]))
      *info = (((*info) < (jxpos)) ? (*info) : (jxpos));
    else if ((incx == 1) && (incx != desc_X[2]) && (ix + n - 1 > desc_X[2]))
      *info = (((*info) < (ixpos)) ? (*info) : (ixpos));
    else {
      if (ix > desc_X[2])
        *info = (((*info) < (ixpos)) ? (*info) : (ixpos));
      else if (jx > desc_X[3])
        *info = (((*info) < (jxpos)) ? (*info) : (jxpos));
    }
  }
  if (*info == 10000) {
    MyRowDist = (myrow + nprow - desc_X[6]) % nprow;
    MyColDist = (mycol + npcol - desc_X[7]) % npcol;
    NRowBlock = desc_X[2] / desc_X[4];
    NColBlock = desc_X[3] / desc_X[5];
    np = (NRowBlock / nprow) * desc_X[4];
    nq = (NColBlock / npcol) * desc_X[5];
    ExtraRowBlock = NRowBlock % nprow;
    ExtraColBlock = NColBlock % npcol;
    ix--;
    jx--;
    MyRowBlock = ix / desc_X[4];
    MyColBlock = jx / desc_X[5];
    *ixrow = (MyRowBlock + desc_X[6]) % nprow;
    *ixcol = (MyColBlock + desc_X[7]) % npcol;
    *iix = (MyRowBlock / nprow + 1) * desc_X[4] + 1;
    *jjx = (MyColBlock / npcol + 1) * desc_X[5] + 1;
    if (MyRowDist >= (MyRowBlock % nprow)) {
      if (myrow == *ixrow)
        *iix += ix % desc_X[4];
      *iix -= desc_X[4];
    }
    if (MyRowDist < ExtraRowBlock)
      np += desc_X[4];
    else if (MyRowDist == ExtraRowBlock)
      np += (desc_X[2] % desc_X[4]);
    np = (((1) > (np)) ? (1) : (np));
    if (MyColDist >= (MyColBlock % npcol)) {
      if (mycol == *ixcol)
        *jjx += jx % desc_X[5];
      *jjx -= desc_X[5];
    }
    if (MyColDist < ExtraColBlock)
      nq += desc_X[5];
    else if (MyColDist == ExtraColBlock)
      nq += (desc_X[3] % desc_X[5]);
    nq = (((1) > (nq)) ? (1) : (nq));
    *iix = (((*iix) < (np)) ? (*iix) : (np));
    *jjx = (((*jjx) < (nq)) ? (*jjx) : (nq));
    if (desc_X[8] < np) {
      if (numroc_(&desc_X[3], &desc_X[5], &mycol, &desc_X[7], &npcol))
        *info = -(descpos + 8);
      else
        *info = 0;
    } else
      *info = 0;
  } else if (*info % 100 == 0) {
    *info = -(*info) / 100;
  } else {
    *info = -(*info);
  }
}
```