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

```asm
<get_sub>:
  endbr64
  mov    %esi,%eax
  push   %r15
  push   %r14
  mov    %edx,%r14d
  cltd
  idiv   %ecx
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%r12
  sub    $0x38,%rsp
  mov    %r9d,%ebx
  mov    %esi,%r13d
  mov    %eax,%ebp
  mov    %r14d,%eax
  cltd
  imul   %ebp,%r8d
  mov    %ebp,%edi
  idiv   %ecx
  mov    %r8d,0x18(%rsp)
  imul   %eax,%edi
  mov    %eax,%r14d
  imul   %eax,%ebx
  shl    $0x2,%edi
  call   <malloc@plt>
  test   %r14d,%r14d
  jle    L4
  test   %ebp,%ebp
  jle    L4
  movslq %ebp,%rdx
  imul   %r13d,%ebx
  mov    %ebp,%r15d
  mov    %rax,%rsi
  lea    0x0(,%rdx,4),%rdi
  movslq %r13d,%rdx
  and    $0xfffffffc,%r15d
  xor    %r10d,%r10d
  mov    %rdi,0x8(%rsp)
  lea    0x0(,%rdx,4),%rdi
  movslq 0x18(%rsp),%rdx
  movslq %ebx,%rcx
  mov    %rdi,0x10(%rsp)
  mov    %rdx,%r8
  add    %rcx,%rdx
  mov    %rcx,%r9
  lea    (%r8,%r15,1),%ebx
  lea    (%r12,%rdx,4),%rcx
  mov    %ebp,%edx
  mov    %ebx,0x1c(%rsp)
  lea    0x1(%r15),%ebx
  shr    $0x2,%edx
  mov    %ebx,0x20(%rsp)
  add    %r8d,%ebx
  lea    -0x1(%rdx),%edi
  mov    %ebx,0x28(%rsp)
  lea    0x2(%r15),%ebx
  add    $0x1,%rdi
  add    %ebx,%r8d
  mov    %ebx,0x24(%rsp)
  lea    -0x1(%rbp),%ebx
  shl    $0x4,%rdi
  mov    %r8d,0x2c(%rsp)
  xor    %r8d,%r8d
  mov    %ebx,0x18(%rsp)
  mov    %ebp,%ebx
  nopl   0x0(%rax)
L25:
  lea    0x4(%rcx),%r11
  mov    %rsi,%rdx
  sub    %r11,%rdx
  cmp    $0x8,%rdx
  jbe    L67
  xor    %edx,%edx
  cmpl   $0x2,0x18(%rsp)
  jbe    L67
  nopl   0x0(%rax)
L77:
  movups (%rcx,%rdx,1),%xmm1
  movups %xmm1,(%rsi,%rdx,1)
  add    $0x10,%rdx
  cmp    %rdi,%rdx
  jne    L77
  cmp    %ebp,%r15d
  je     L83
  mov    0x1c(%rsp),%edx
  mov    0x20(%rsp),%r11d
  add    %r9d,%edx
  movslq %edx,%rdx
  movss  (%r12,%rdx,4),%xmm0
  lea    (%r8,%r15,1),%edx
  movslq %edx,%rdx
  movss  %xmm0,(%rax,%rdx,4)
  cmp    %r11d,%ebp
  jle    L83
  mov    0x28(%rsp),%edx
  add    %r9d,%edx
  movslq %edx,%rdx
  movss  (%r12,%rdx,4),%xmm0
  lea    (%r8,%r11,1),%edx
  mov    0x24(%rsp),%r11d
  movslq %edx,%rdx
  movss  %xmm0,(%rax,%rdx,4)
  cmp    %r11d,%ebp
  jle    L83
  mov    0x2c(%rsp),%edx
  add    %r9d,%edx
  movslq %edx,%rdx
  movss  (%r12,%rdx,4),%xmm0
  lea    (%r8,%r11,1),%edx
  movslq %edx,%rdx
  movss  %xmm0,(%rax,%rdx,4)
L83:
  add    $0x1,%r10d
  add    0x8(%rsp),%rsi
  add    %r13d,%r9d
  add    %ebp,%r8d
  add    0x10(%rsp),%rcx
  cmp    %r10d,%r14d
  jne    L25
L4:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L67:
  xor    %edx,%edx
  nopw   0x0(%rax,%rax,1)
L97:
  movss  (%rcx,%rdx,4),%xmm0
  movss  %xmm0,(%rsi,%rdx,4)
  add    $0x1,%rdx
  cmp    %rbx,%rdx
  jne    L97
  jmp    L83
```

assistant: ```c
float *get_sub(float *a, int x0, int y0, int blockDiv, int i, int j) {
  int xs = x0 / blockDiv;
  int ys = y0 / blockDiv;
  int xbase = i * xs;
  int ybase = j * ys;
  int x, y;
  float *result = malloc(xs * ys * sizeof(float));
  for (y = 0; y < ys; y++)
    for (x = 0; x < xs; x++)
      result[y * xs + x] = a[(y + ybase) * x0 + (x + xbase)];
  return result;
}
```