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

```asm
<multBek>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    $0x10,%edi
  call   <malloc@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  mov    %edx,%ecx
  imul   %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x8(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  mov    %edx,%ecx
  imul   %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x24,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x34,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  imul   %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  add    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  mov    %edx,%ecx
  imul   %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x38,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  imul   %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  add    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  mov    %edx,%ecx
  imul   %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x2c,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  imul   %edx,%eax
  add    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x3c,%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  imul   %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0xc,%rax
  add    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x8(%rbp),%rax
  leave
  ret
```

assistant: ```c
GLdouble *multBek(GLdouble *m, GLdouble *v) {
  GLdouble *result = (GLdouble *)malloc(sizeof(GLdouble) * 4);
  result[0] = m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12] * v[3];
  result[1] = m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13] * v[3];
  result[2] = m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14] * v[3];
  result[3] = m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3];
  return (result);
}
```