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

```asm
<rc2_decrypt>:
  endbr64
  push   %rbx
  mov    %rsi,%r10
  movzbl 0x7(%rdx),%esi
  mov    %rdx,%r8
  movzbl 0x6(%rdx),%eax
  movzbl 0x5(%rdx),%ecx
  mov    $0x3f,%r9d
  mov    $0x820,%r11d
  shl    $0x8,%esi
  add    %eax,%esi
  movzbl 0x4(%rdx),%eax
  shl    $0x8,%ecx
  movzbl 0x3(%rdx),%edx
  add    %eax,%ecx
  movzbl 0x2(%r8),%eax
  shl    $0x8,%edx
  add    %eax,%edx
  movzbl 0x1(%r8),%eax
  movzbl (%r8),%r8d
  shl    $0x8,%eax
  add    %r8d,%eax
  mov    $0xf,%r8d
  nopl   0x0(%rax)
L6:
  movzwl %si,%ebx
  mov    %ebx,%esi
  shr    $0x5,%ebx
  shl    $0xb,%esi
  add    %ebx,%esi
  mov    %ecx,%ebx
  and    %edx,%ebx
  sub    %ebx,%esi
  mov    %ecx,%ebx
  not    %ebx
  and    %eax,%ebx
  sub    %ebx,%esi
  mov    %r9d,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%esi
  movzwl %cx,%ebx
  mov    %ebx,%ecx
  shr    $0x3,%ebx
  shl    $0xd,%ecx
  add    %ebx,%ecx
  mov    %edx,%ebx
  and    %eax,%ebx
  sub    %ebx,%ecx
  lea    -0x1(%r9),%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%ecx
  mov    %edx,%ebx
  not    %ebx
  and    %esi,%ebx
  sub    %ebx,%ecx
  movzwl %dx,%ebx
  mov    %ebx,%edx
  shr    $0x2,%ebx
  shl    $0xe,%edx
  add    %ebx,%edx
  lea    -0x2(%r9),%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%edx
  mov    %eax,%ebx
  and    %esi,%ebx
  sub    %ebx,%edx
  mov    %eax,%ebx
  not    %ebx
  and    %ecx,%ebx
  sub    %ebx,%edx
  movzwl %ax,%ebx
  mov    %ebx,%eax
  shr    %ebx
  shl    $0xf,%eax
  add    %ebx,%eax
  lea    0x0(,%r8,4),%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%eax
  mov    %esi,%ebx
  and    %ecx,%ebx
  sub    %ebx,%eax
  mov    %esi,%ebx
  not    %ebx
  and    %edx,%ebx
  sub    %ebx,%eax
  bt     %r8,%r11
  jae    L7
  mov    %ecx,%ebx
  and    $0x3f,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%esi
  mov    %edx,%ebx
  and    $0x3f,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%ecx
  mov    %eax,%ebx
  and    $0x3f,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%edx
  mov    %esi,%ebx
  and    $0x3f,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%eax
L7:
  sub    $0x1,%r8d
  sub    $0x4,%r9d
  cmp    $0xffffffff,%r8d
  jne    L6
  mov    %esi,%r8d
  mov    %ecx,%r11d
  movzbl %sil,%esi
  mov    %edx,%r9d
  shr    $0x8,%r8d
  shr    $0x8,%r11d
  movzbl %cl,%ecx
  mov    %eax,%edi
  movzbl %r8b,%r8d
  shr    $0x8,%r9d
  movzbl %dl,%edx
  movzbl %al,%eax
  shl    $0x8,%r8
  movzbl %r9b,%r9d
  shr    $0x8,%edi
  pop    %rbx
  or     %r8,%rsi
  movzbl %r11b,%r8d
  movzbl %dil,%edi
  shl    $0x8,%rsi
  or     %r8,%rsi
  shl    $0x8,%rsi
  or     %rsi,%rcx
  shl    $0x8,%rcx
  or     %r9,%rcx
  shl    $0x8,%rcx
  or     %rcx,%rdx
  shl    $0x8,%rdx
  or     %rdi,%rdx
  shl    $0x8,%rdx
  or     %rdx,%rax
  mov    %rax,(%r10)
  ret
```

assistant: ```c
void rc2_decrypt(const unsigned short xkey[64], unsigned char *plain, const unsigned char *cipher) {
  unsigned x76, x54, x32, x10, i;
  x76 = (cipher[7] << 8) + cipher[6];
  x54 = (cipher[5] << 8) + cipher[4];
  x32 = (cipher[3] << 8) + cipher[2];
  x10 = (cipher[1] << 8) + cipher[0];
  i = 15;
  do {
    x76 &= 65535;
    x76 = (x76 << 11) + (x76 >> 5);
    x76 -= (x10 & ~x54) + (x32 & x54) + xkey[4 * i + 3];
    x54 &= 65535;
    x54 = (x54 << 13) + (x54 >> 3);
    x54 -= (x76 & ~x32) + (x10 & x32) + xkey[4 * i + 2];
    x32 &= 65535;
    x32 = (x32 << 14) + (x32 >> 2);
    x32 -= (x54 & ~x10) + (x76 & x10) + xkey[4 * i + 1];
    x10 &= 65535;
    x10 = (x10 << 15) + (x10 >> 1);
    x10 -= (x32 & ~x76) + (x54 & x76) + xkey[4 * i + 0];
    if (i == 5 || i == 11) {
      x76 -= xkey[x54 & 63];
      x54 -= xkey[x32 & 63];
      x32 -= xkey[x10 & 63];
      x10 -= xkey[x76 & 63];
    }
  } while (i--);
  plain[0] = (unsigned char)x10;
  plain[1] = (unsigned char)(x10 >> 8);
  plain[2] = (unsigned char)x32;
  plain[3] = (unsigned char)(x32 >> 8);
  plain[4] = (unsigned char)x54;
  plain[5] = (unsigned char)(x54 >> 8);
  plain[6] = (unsigned char)x76;
  plain[7] = (unsigned char)(x76 >> 8);
}
```