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

```asm
<rc2_decrypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  movl   $0xf,-0x4(%rbp)
L1:
  andl   $0xffff,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  shl    $0xb,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  shr    $0x5,%eax
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x10(%rbp),%eax
  not    %eax
  and    -0x8(%rbp),%eax
  mov    %eax,%edx
  mov    -0xc(%rbp),%eax
  and    -0x10(%rbp),%eax
  add    %eax,%edx
  mov    -0x4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x3,%eax
  mov    %eax,%eax
  lea    (%rax,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  add    %edx,%eax
  sub    %eax,-0x14(%rbp)
  andl   $0xffff,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  shl    $0xd,%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  shr    $0x3,%eax
  add    %edx,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0xc(%rbp),%eax
  not    %eax
  and    -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  and    -0xc(%rbp),%eax
  add    %eax,%edx
  mov    -0x4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x2,%eax
  mov    %eax,%eax
  lea    (%rax,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  add    %edx,%eax
  sub    %eax,-0x10(%rbp)
  andl   $0xffff,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0xe,%eax
  mov    %eax,%edx
  mov    -0xc(%rbp),%eax
  shr    $0x2,%eax
  add    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x8(%rbp),%eax
  not    %eax
  and    -0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  and    -0x8(%rbp),%eax
  add    %eax,%edx
  mov    -0x4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    (%rax,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  add    %edx,%eax
  sub    %eax,-0xc(%rbp)
  andl   $0xffff,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  shl    $0xf,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  shr    %eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x14(%rbp),%eax
  not    %eax
  and    -0xc(%rbp),%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  and    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    -0x4(%rbp),%eax
  shl    $0x2,%eax
  mov    %eax,%eax
  lea    (%rax,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  add    %edx,%eax
  sub    %eax,-0x8(%rbp)
  cmpl   $0x5,-0x4(%rbp)
  je     L22
  cmpl   $0xb,-0x4(%rbp)
  jne    L3
L22:
  mov    -0x10(%rbp),%eax
  and    $0x3f,%eax
  lea    (%rax,%rax,1),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  sub    %eax,-0x14(%rbp)
  mov    -0xc(%rbp),%eax
  and    $0x3f,%eax
  lea    (%rax,%rax,1),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  sub    %eax,-0x10(%rbp)
  mov    -0x8(%rbp),%eax
  and    $0x3f,%eax
  lea    (%rax,%rax,1),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  sub    %eax,-0xc(%rbp)
  mov    -0x14(%rbp),%eax
  and    $0x3f,%eax
  lea    (%rax,%rax,1),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  sub    %eax,-0x8(%rbp)
L3:
  mov    -0x4(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x4(%rbp)
  test   %eax,%eax
  jne    L1
  mov    -0x8(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x2,%rax
  mov    -0xc(%rbp),%edx
  mov    %dl,(%rax)
  mov    -0xc(%rbp),%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    -0x10(%rbp),%edx
  mov    %dl,(%rax)
  mov    -0x10(%rbp),%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  add    $0x5,%rax
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x6,%rax
  mov    -0x14(%rbp),%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  add    $0x7,%rax
  mov    %dl,(%rax)
  nop
  pop    %rbp
  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);
}
```