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

```asm
<init_by_array>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    $0x12bd6aa,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <init_genrand@plt>
  movq   $0x1,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  mov    -0x40(%rbp),%rax
  mov    $0x270,%edx
  cmp    %rdx,%rax
  cmovl  %rdx,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L18
L7:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x18(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  mov    (%rax),%rax
  shr    $0x1e,%rax
  xor    %rcx,%rax
  imul   $0x19660d,%rax,%rax
  xor    %rax,%rdx
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x38(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x10(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    %edx,%edx
  mov    %rdx,(%rax)
  addq   $0x1,-0x18(%rbp)
  addq   $0x1,-0x10(%rbp)
  cmpq   $0x26f,-0x18(%rbp)
  jle    L66
  mov    -0x28(%rbp),%rax
  mov    0x1378(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  movq   $0x1,-0x18(%rbp)
L66:
  mov    -0x10(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jl     L22
  movq   $0x0,-0x10(%rbp)
L22:
  subq   $0x1,-0x8(%rbp)
L18:
  cmpq   $0x0,-0x8(%rbp)
  jne    L7
  movq   $0x26f,-0x8(%rbp)
  jmp    L25
L53:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x18(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  mov    (%rax),%rax
  shr    $0x1e,%rax
  xor    %rcx,%rax
  imul   $0x5d588b65,%rax,%rax
  xor    %rax,%rdx
  mov    -0x18(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  sub    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    %edx,%edx
  mov    %rdx,(%rax)
  addq   $0x1,-0x18(%rbp)
  cmpq   $0x26f,-0x18(%rbp)
  jle    L33
  mov    -0x28(%rbp),%rax
  mov    0x1378(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  movq   $0x1,-0x18(%rbp)
L33:
  subq   $0x1,-0x8(%rbp)
L25:
  cmpq   $0x0,-0x8(%rbp)
  jne    L53
  mov    -0x28(%rbp),%rax
  mov    $0x80000000,%edi
  mov    %rdi,(%rax)
  mov    -0x30(%rbp),%rax
  movq   $0x271,(%rax)
  nop
  leave
  ret
```

assistant: ```c
void init_by_array(unsigned long mt[], unsigned long *mtiPtr, unsigned long init_key[], long key_length) {
  long i, j, k;
  init_genrand(mt, mtiPtr, 19650218UL);
  i = 1;
  j = 0;
  k = (624 > key_length ? 624 : key_length);
  for (; k; k--) {
    mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1664525UL)) + init_key[j] + j;
    mt[i] &= 0xffffffffUL;
    i++;
    j++;
    if (i >= 624) {
      mt[0] = mt[624 - 1];
      i = 1;
    }
    if (j >= key_length)
      j = 0;
  }
  for (k = 624 - 1; k; k--) {
    mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1566083941UL)) - i;
    mt[i] &= 0xffffffffUL;
    i++;
    if (i >= 624) {
      mt[0] = mt[624 - 1];
      i = 1;
    }
  }
  mt[0] = 0x80000000UL;
  (*mtiPtr) = 624 + 1;
}
```