user: Translate the below assembly code into C programming language:

```asm
<motion_vectors>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %ecx,-0x2c(%rbp)
  mov    %r8d,-0x30(%rbp)
  mov    %r9d,-0x34(%rbp)
  cmpl   $0x1,-0x30(%rbp)
  jne    L31
  cmpl   $0x0,-0x34(%rbp)
  jne    L33
  cmpl   $0x0,0x20(%rbp)
  jne    L33
  mov    $0x1,%edi
  call   <Get_Bits@plt>
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x28(%rbp),%rax
  mov    -0x2c(%rbp),%edx
  movslq %edx,%rdx
  mov    -0x4(%rbp),%ecx
  mov    %ecx,(%rax,%rdx,4)
  mov    -0x28(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    -0x2c(%rbp),%eax
  cltq
  mov    -0x4(%rbp),%edx
  mov    %edx,(%rcx,%rax,4)
L33:
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    0x28(%rbp),%esi
  mov    0x20(%rbp),%ecx
  mov    0x18(%rbp),%edx
  mov    -0x20(%rbp),%rax
  sub    $0x8,%rsp
  push   $0x0
  mov    %esi,%r9d
  mov    %ecx,%r8d
  mov    %edx,%ecx
  mov    0x10(%rbp),%edx
  mov    %rax,%rsi
  call   <motion_vector@plt>
  add    $0x10,%rsp
  mov    -0x18(%rbp),%rax
  lea    0x10(%rax),%rcx
  mov    -0x18(%rbp),%rax
  mov    -0x2c(%rbp),%edx
  movslq %edx,%rdx
  mov    (%rax,%rdx,8),%edx
  mov    -0x2c(%rbp),%eax
  cltq
  mov    %edx,(%rcx,%rax,8)
  mov    -0x18(%rbp),%rax
  lea    0x10(%rax),%rcx
  mov    -0x18(%rbp),%rax
  mov    -0x2c(%rbp),%edx
  movslq %edx,%rdx
  mov    0x4(%rax,%rdx,8),%edx
  mov    -0x2c(%rbp),%eax
  cltq
  mov    %edx,0x4(%rcx,%rax,8)
  jmp    L14
L31:
  mov    $0x1,%edi
  call   <Get_Bits@plt>
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%ecx
  mov    -0x28(%rbp),%rax
  mov    -0x2c(%rbp),%edx
  movslq %edx,%rdx
  mov    %ecx,(%rax,%rdx,4)
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    0x28(%rbp),%esi
  mov    0x20(%rbp),%ecx
  mov    0x18(%rbp),%edx
  mov    -0x20(%rbp),%rax
  sub    $0x8,%rsp
  push   $0x0
  mov    %esi,%r9d
  mov    %ecx,%r8d
  mov    %edx,%ecx
  mov    0x10(%rbp),%edx
  mov    %rax,%rsi
  call   <motion_vector@plt>
  add    $0x10,%rsp
  mov    $0x1,%edi
  call   <Get_Bits@plt>
  mov    %eax,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    -0xc(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  cltq
  mov    %edx,(%rcx,%rax,4)
  mov    -0x18(%rbp),%rax
  lea    0x10(%rax),%rdx
  mov    -0x2c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    (%rdx,%rax,1),%rdi
  mov    0x28(%rbp),%esi
  mov    0x20(%rbp),%ecx
  mov    0x18(%rbp),%edx
  mov    -0x20(%rbp),%rax
  sub    $0x8,%rsp
  push   $0x0
  mov    %esi,%r9d
  mov    %ecx,%r8d
  mov    %edx,%ecx
  mov    0x10(%rbp),%edx
  mov    %rax,%rsi
  call   <motion_vector@plt>
  add    $0x10,%rsp
  nop
L14:
  leave
  ret
```

assistant: ```c
void motion_vectors(int (*PMV)[2][2], int *dmvector, int (*motion_vertical_field_select)[2], int s, int motion_vector_count, int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale) {
  int tmp;
  unsigned int tmp___0;
  unsigned int tmp___1;
  unsigned int tmp___2;
  {
    if (motion_vector_count == 1) {
      if (mv_format == 0) {
        if (!dmv) {
          tmp___0 = Get_Bits(1);
          tmp = (int)tmp___0;
          (*(motion_vertical_field_select + 0))[s] = tmp;
          (*(motion_vertical_field_select + 1))[s] = tmp;
        }
      }
      motion_vector((*(PMV + 0))[s], (int *)dmvector, h_r_size, v_r_size, dmv, mvscale, 0);
      (*(PMV + 1))[s][0] = (*(PMV + 0))[s][0];
      (*(PMV + 1))[s][1] = (*(PMV + 0))[s][1];
    } else {
      tmp___1 = Get_Bits(1);
      (*(motion_vertical_field_select + 0))[s] = (int)tmp___1;
      motion_vector((*(PMV + 0))[s], (int *)dmvector, h_r_size, v_r_size, dmv, mvscale, 0);
      tmp___2 = Get_Bits(1);
      (*(motion_vertical_field_select + 1))[s] = (int)tmp___2;
      motion_vector((*(PMV + 1))[s], (int *)dmvector, h_r_size, v_r_size, dmv, mvscale, 0);
    }
    return;
  }
}
```