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

```asm
<lin_solve>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %edi,0x7c(%rsp)
  mov    %esi,0x8c(%rsp)
  mov    %rdx,0x38(%rsp)
  mov    %rcx,0x48(%rsp)
  movss  %xmm0,0xc(%rsp)
  movss  %xmm1,0x78(%rsp)
  lea    0x2(%rdi),%eax
  mov    %eax,%edx
  imul   %eax,%edx
  movslq %edx,%r14
  movslq %eax,%rbx
  mov    %rbx,0x30(%rsp)
  lea    0x1(%rbx),%rax
  mov    %rax,0x60(%rsp)
  add    %r14,%rax
  shl    $0x2,%rax
  mov    %rax,0x80(%rsp)
  lea    0x0(,%rbx,4),%rax
  mov    %rax,0x40(%rsp)
  lea    0x0(,%r14,4),%r15
  mov    %r14,%rax
  neg    %rax
  lea    0x0(,%rax,4),%r13
  movl   $0xa,0x88(%rsp)
  mov    %r15,%r12
  jmp    L24
L11:
  mov    0x50(%rsp),%rax
  mov    %rax,%rbp
  add    $0x1,%rax
  mov    %rax,0x50(%rsp)
  lea    0x2(%rbp),%rbx
  mov    %rbx,0x18(%rsp)
  mov    0x70(%rsp),%rbx
  lea    (%rbx,%rbp,1),%r15
  mov    0x60(%rsp),%rbx
  add    %rbp,%rbx
  mov    %rbx,0x20(%rsp)
  mov    0x58(%rsp),%r11
  mov    %rax,0x10(%rsp)
  mov    $0x1,%ebx
L0:
  mov    0x48(%rsp),%rax
  lea    (%rax,%r11,1),%rcx
  mov    0x38(%rsp),%rax
  add    %r11,%rax
  mov    %rax,0x28(%rsp)
  mov    $0x1,%edx
  mov    %rbp,%r9
  mov    0x10(%rsp),%rsi
  sub    %rsi,%r9
  mov    0x18(%rsp),%r8
  sub    %rsi,%r8
  mov    %r15,%rdi
  sub    %rsi,%rdi
  mov    0x20(%rsp),%rax
  sub    %rsi,%rax
  mov    %rax,%rsi
  mov    0x28(%rsp),%rax
L58:
  add    $0x1,%edx
  movss  (%rax,%r9,4),%xmm0
  addss  (%rax,%r8,4),%xmm0
  addss  (%rax,%rdi,4),%xmm0
  addss  (%rax,%rsi,4),%xmm0
  addss  (%rax,%r13,1),%xmm0
  addss  (%rax,%r14,4),%xmm0
  mulss  0xc(%rsp),%xmm0
  addss  (%rcx),%xmm0
  divss  0x78(%rsp),%xmm0
  movss  %xmm0,(%rax)
  add    %r12,%rcx
  add    %r12,%rax
  cmp    %r10d,%edx
  jne    L58
  add    $0x1,%ebx
  mov    0x30(%rsp),%rax
  add    %rax,%rbp
  add    %rax,0x10(%rsp)
  add    %rax,0x18(%rsp)
  add    %rax,%r15
  add    %rax,0x20(%rsp)
  add    0x40(%rsp),%r11
  cmp    %r10d,%ebx
  jne    L0
  addq   $0x4,0x58(%rsp)
  mov    0x68(%rsp),%rbx
  cmp    %rbx,0x50(%rsp)
  jne    L11
L8:
  mov    0x8c(%rsp),%edx
  mov    0x38(%rsp),%rsi
  mov    0x7c(%rsp),%edi
  call   <boundary_condition@plt>
  subl   $0x1,0x88(%rsp)
  je     L48
L24:
  mov    0x7c(%rsp),%ebx
  test   %ebx,%ebx
  jle    L8
  mov    %ebx,%eax
  mov    0x30(%rsp),%rcx
  add    %rcx,%rax
  mov    %rax,0x68(%rsp)
  mov    0x80(%rsp),%rax
  mov    %rax,0x58(%rsp)
  mov    %rcx,0x50(%rsp)
  mov    $0x1,%eax
  sub    %rcx,%rax
  mov    %rax,0x70(%rsp)
  lea    0x1(%rbx),%r10d
  jmp    L11
L48:
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void lin_solve(int N, int b, float *value, float *value_prev, float a, float c) {
  int count;
  int count_x;
  int count_y;
  int count_z;
  for (count = 0; count < 10; count++) {
    for (count_x = 1; count_x <= N; count_x++) {
      for (count_y = 1; count_y <= N; count_y++) {
        for (count_z = 1; count_z <= N; count_z++) {
          value[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] = (value_prev[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] + a * (value[((count_x - 1) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] + value[((count_x + 1) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] + value[((count_x) + (N + 2) * (count_y - 1) + (N + 2) * (N + 2) * (count_z))] + value[((count_x) + (N + 2) * (count_y + 1) + (N + 2) * (N + 2) * (count_z))] + value[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z - 1))] + value[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z + 1))])) / c;
        }
      }
    }
    boundary_condition(N, value, b);
  }
}
```