user: 请将以下的汇编代码转换成C语言代码:

```asm
<rc2_decrypt>:
  endbr64
  push   %rbx
  movzbl 0x7(%rdx),%eax
  mov    %rdx,%r8
  mov    %rsi,%r10
  movzbl 0x6(%rdx),%edx
  movzbl 0x4(%r8),%ecx
  mov    $0x3f,%r9d
  mov    $0x820,%r11d
  shl    $0x8,%eax
  movzbl 0x2(%r8),%esi
  add    %edx,%eax
  movzbl 0x5(%r8),%edx
  shl    $0x8,%edx
  add    %ecx,%edx
  movzbl 0x3(%r8),%ecx
  shl    $0x8,%ecx
  add    %esi,%ecx
  movzbl 0x1(%r8),%esi
  movzbl (%r8),%r8d
  shl    $0x8,%esi
  add    %r8d,%esi
  mov    $0xf,%r8d
  nopw   0x0(%rax,%rax,1)
L6:
  movzwl %ax,%ebx
  mov    %ebx,%eax
  shr    $0x5,%ebx
  shl    $0xb,%eax
  add    %ebx,%eax
  mov    %edx,%ebx
  and    %ecx,%ebx
  sub    %ebx,%eax
  mov    %edx,%ebx
  not    %ebx
  and    %esi,%ebx
  sub    %ebx,%eax
  mov    %r9d,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%eax
  movzwl %dx,%ebx
  mov    %ebx,%edx
  shr    $0x3,%ebx
  shl    $0xd,%edx
  add    %ebx,%edx
  mov    %ecx,%ebx
  and    %esi,%ebx
  sub    %ebx,%edx
  lea    -0x1(%r9),%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%edx
  mov    %ecx,%ebx
  not    %ebx
  and    %eax,%ebx
  sub    %ebx,%edx
  movzwl %cx,%ebx
  mov    %ebx,%ecx
  shr    $0x2,%ebx
  shl    $0xe,%ecx
  add    %ebx,%ecx
  lea    -0x2(%r9),%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%ecx
  mov    %esi,%ebx
  and    %eax,%ebx
  sub    %ebx,%ecx
  mov    %esi,%ebx
  not    %ebx
  and    %edx,%ebx
  sub    %ebx,%ecx
  movzwl %si,%ebx
  mov    %ebx,%esi
  shr    %ebx
  shl    $0xf,%esi
  add    %ebx,%esi
  lea    0x0(,%r8,4),%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%esi
  mov    %eax,%ebx
  and    %edx,%ebx
  sub    %ebx,%esi
  mov    %eax,%ebx
  not    %ebx
  and    %ecx,%ebx
  sub    %ebx,%esi
  bt     %r8,%r11
  jae    L18
  mov    %edx,%ebx
  and    $0x3f,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%eax
  mov    %ecx,%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,%ecx
  mov    %eax,%ebx
  and    $0x3f,%ebx
  movzwl (%rdi,%rbx,2),%ebx
  sub    %ebx,%esi
L18:
  sub    $0x1,%r8d
  sub    $0x4,%r9d
  cmp    $0xffffffff,%r8d
  jne    L6
  mov    %si,(%r10)
  pop    %rbx
  mov    %cx,0x2(%r10)
  mov    %dx,0x4(%r10)
  mov    %ax,0x6(%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);
}
```