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

```asm
<encshare2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x4c0(%rax),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x4c4(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x4c8(%rax),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x4cc(%rax),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L15
L22:
  mov    -0x20(%rbp),%eax
  add    $0x110,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  jmp    L23
L10:
  mov    -0x18(%rbp),%eax
  add    %eax,-0x24(%rbp)
  addq   $0x4,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  add    %eax,-0x24(%rbp)
  mov    -0x10(%rbp),%rax
  lea    -0x44(%rax),%rdx
  mov    -0x24(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x10(%rbp),%rax
  lea    -0x4(%rax),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x1c(%rbp),%eax
  ror    $0x8,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x10(%rbp),%rax
  lea    0x3c(%rax),%rdx
  mov    -0x18(%rbp),%eax
  mov    %eax,(%rdx)
  shll   -0x18(%rbp)
  addl   $0x1,-0x20(%rbp)
  mov    -0x24(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x14(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  ror    $0x8,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x24(%rbp),%eax
  rol    $0x8,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x14(%rbp)
  mov    -0x1c(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x1c(%rbp)
  mov    -0x14(%rbp),%eax
  rol    $0x8,%eax
  mov    %eax,-0x24(%rbp)
L23:
  cmpl   $0xffff,-0x18(%rbp)
  jbe    L10
  mov    -0x24(%rbp),%eax
  xor    %eax,-0x1c(%rbp)
  mov    -0x40(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x40(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    %edx,(%rax)
  subl   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  add    $0x100,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x20(%rbp),%eax
  add    $0x110,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x18(%rbp)
  notl   -0x24(%rbp)
  mov    -0x24(%rbp),%eax
  ror    $0x8,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x1c(%rbp)
  mov    -0x18(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  ror    $0x8,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x18(%rbp),%eax
  rol    $0x8,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x24(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x14(%rbp),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  xor    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  rol    $0x8,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x20(%rbp),%eax
  add    $0x120,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  add    %eax,%eax
  add    $0x1,%eax
  mov    %eax,-0x18(%rbp)
L15:
  mov    -0x40(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jb     L22
  mov    -0x38(%rbp),%rax
  lea    0x4c0(%rax),%rdx
  mov    -0x20(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x38(%rbp),%rax
  lea    0x4c4(%rax),%rdx
  mov    -0x24(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x38(%rbp),%rax
  lea    0x4c8(%rax),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x38(%rbp),%rax
  lea    0x4cc(%rax),%rdx
  mov    -0x18(%rbp),%eax
  mov    %eax,(%rdx)
  nop
  pop    %rbp
  ret
```

assistant: ```c
void encshare2(unsigned int *tbuff, unsigned int *tbuffp, int len) {
  unsigned int t1, t2, t3, t4, t5, *limit, *p;
  t2 = tbuff[304];
  t1 = tbuff[305];
  t3 = tbuff[306];
  t5 = tbuff[307];
  limit = tbuffp + len;
  while (tbuffp < limit) {
    p = tbuff + t2 + 272;
    while (t5 < 65536) {
      t1 += t5;
      p++;
      t3 += t1;
      t1 += t3;
      p[-17] = t1;
      p[-1] = t3;
      t4 = (t3 << 24) | (t3 >> 8);
      p[15] = t5;
      t5 <<= 1;
      t2++;
      t1 ^= tbuff[t1 & 0xff];
      t4 ^= tbuff[t4 & 0xff];
      t3 = (t4 << 24) | (t4 >> 8);
      t4 = (t1 >> 24) | (t1 << 8);
      t4 ^= tbuff[t4 & 0xff];
      t3 ^= tbuff[t3 & 0xff];
      t1 = (t4 >> 24) | (t4 << 8);
    }
    t3 ^= t1;
    *tbuffp++ = t3;
    t2--;
    t1 = tbuff[t2 + 256];
    t5 = tbuff[t2 + 272];
    t1 = ~t1;
    t3 = (t1 << 24) | (t1 >> 8);
    t3 ^= tbuff[t3 & 0xff];
    t5 ^= tbuff[t5 & 0xff];
    t1 = (t3 << 24) | (t3 >> 8);
    t4 = (t5 >> 24) | (t5 << 8);
    t1 ^= tbuff[t1 & 0xff];
    t4 ^= tbuff[t4 & 0xff];
    t3 = (t4 >> 24) | (t4 << 8);
    t5 = (tbuff[t2 + 288] << 1) + 1;
  }
  tbuff[304] = t2;
  tbuff[305] = t1;
  tbuff[306] = t3;
  tbuff[307] = t5;
}
```