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

```asm
<sony_decrypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    %ecx,-0x24(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  je     L4
  movl   $0x0,D65(%rip)
  jmp    L96
L44:
  mov    -0x24(%rbp),%eax
  imul   $0x2e90edd,%eax,%eax
  add    $0x1,%eax
  mov    %eax,-0x24(%rbp)
  mov    D65(%rip),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%edx
  lea    0x0(,%rdx,4),%rcx
  lea    D294(%rip),%rdx
  mov    %eax,(%rcx,%rdx,1)
  mov    D65(%rip),%eax
  add    $0x1,%eax
  mov    %eax,D272(%rip)
L96:
  mov    D272(%rip),%eax
  cmp    $0x3,%eax
  jbe    L44
  mov    D272(%rip),%eax
  lea    (%rax,%rax,1),%ecx
  mov    D294(%rip),%edx
  mov    D291(%rip),%eax
  xor    %edx,%eax
  shr    $0x1f,%eax
  or     %ecx,%eax
  mov    %eax,D116(%rip)
  movl   $0x4,D272(%rip)
  jmp    L0
L99:
  mov    D272(%rip),%eax
  sub    $0x4,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%ecx
  mov    D272(%rip),%eax
  sub    $0x2,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  lea    (%rax,%rax,1),%esi
  mov    D272(%rip),%eax
  sub    $0x3,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%ecx
  mov    D272(%rip),%eax
  sub    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  shr    $0x1f,%eax
  mov    %eax,%edx
  mov    D272(%rip),%eax
  or     %edx,%esi
  mov    %esi,%ecx
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    %ecx,(%rdx,%rax,1)
  mov    D272(%rip),%eax
  add    $0x1,%eax
  mov    %eax,D116(%rip)
L0:
  mov    D116(%rip),%eax
  cmp    $0x7e,%eax
  jbe    L99
  movl   $0x0,D116(%rip)
  jmp    L92
L41:
  mov    D116(%rip),%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  mov    D116(%rip),%ebx
  mov    %eax,%edi
  call   <htonl@plt>
  mov    %ebx,%edx
  lea    0x0(,%rdx,4),%rcx
  lea    D294(%rip),%rdx
  mov    %eax,(%rcx,%rdx,1)
  mov    D116(%rip),%eax
  add    $0x1,%eax
  mov    %eax,D116(%rip)
L92:
  mov    D116(%rip),%eax
  cmp    $0x7e,%eax
  jbe    L41
  jmp    L4
L35:
  mov    D116(%rip),%eax
  and    $0x7f,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%ecx
  mov    D116(%rip),%eax
  add    $0x40,%eax
  and    $0x7f,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%edx
  mov    D116(%rip),%eax
  sub    $0x1,%eax
  and    $0x7f,%eax
  mov    %eax,%esi
  xor    %edx,%ecx
  mov    %esi,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    %ecx,(%rdx,%rax,1)
  mov    %esi,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D294(%rip),%rax
  mov    (%rdx,%rax,1),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    (%rax),%edx
  xor    %ecx,%edx
  mov    %edx,(%rax)
L4:
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x1c(%rbp)
  test   %eax,%eax
  je     L29
  mov    D116(%rip),%eax
  lea    0x1(%rax),%edx
  mov    %edx,D116(%rip)
  test   %eax,%eax
  jne    L35
L29:
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void sony_decrypt(unsigned *data, int len, int start, int key) {
  static unsigned pad[128], p;
  if (start) {
    for (p = 0; p < 4; p++)
      pad[p] = key = key * 48828125 + 1;
    pad[3] = pad[3] << 1 | (pad[0] ^ pad[2]) >> 31;
    for (p = 4; p < 127; p++)
      pad[p] = (pad[p - 4] ^ pad[p - 2]) << 1 | (pad[p - 3] ^ pad[p - 1]) >> 31;
    for (p = 0; p < 127; p++)
      pad[p] = htonl(pad[p]);
  }
  while (len-- && p++)
    *data++ ^= pad[(p - 1) & 127] = pad[p & 127] ^ pad[(p + 64) & 127];
}
```