user: 下面的汇编指令对应的C源代码是什么:

```asm
<gauss_seidel>:
  endbr64
  push   %r15
  movapd %xmm0,%xmm5
  mov    %rdi,%r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdx,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %r8d,0x1c(%rsp)
  test   %ecx,%ecx
  jle    L111
  mov    %ecx,%r8d
  xor    %edi,%edi
  lea    0x0(,%r8,8),%r9
  cs nopw 0x0(%rax,%rax,1)
L24:
  mov    (%r15,%rdi,1),%rax
  movsd  (%rax,%rdi,1),%xmm1
  lea    (%rax,%r9,1),%rdx
  nopl   (%rax)
L37:
  movsd  (%rax),%xmm0
  add    $0x8,%rax
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rax)
  cmp    %rdx,%rax
  jne    L37
  movsd  (%rsi,%rdi,1),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,(%rsi,%rdi,1)
  add    $0x8,%rdi
  cmp    %r9,%rdi
  jne    L24
  mov    %r15,%r9
  xor    %edx,%edx
  nopw   0x0(%rax,%rax,1)
L142:
  movsd  (%rsi,%rdx,8),%xmm1
  xor    %eax,%eax
  nop
L2:
  cmp    %edx,%eax
  je     L9
  mov    (%r9),%rdi
  movsd  (%rdi,%rax,8),%xmm0
  mulsd  0x0(%rbp,%rax,8),%xmm0
  subsd  %xmm0,%xmm1
L9:
  add    $0x1,%rax
  cmp    %r8,%rax
  jne    L2
  movsd  %xmm1,0x0(%rbp,%rdx,8)
  add    $0x1,%rdx
  add    $0x8,%r9
  cmp    %r8,%rdx
  jne    L142
L111:
  mov    $0x1,%edi
  mov    $0x1,%r12d
  pxor   %xmm3,%xmm3
  nopl   0x0(%rax)
L45:
  test   %ecx,%ecx
  jle    L87
  mov    %r15,%r14
  movslq %ecx,%r13
  xor    %ebx,%ebx
  xor    %r8d,%r8d
  nopw   0x0(%rax,%rax,1)
L14:
  movsd  0x0(%rbp,%rbx,8),%xmm2
  movsd  (%rsi,%rbx,8),%xmm1
  xor    %eax,%eax
  nopl   (%rax)
L125:
  cmp    %eax,%ebx
  je     L11
  mov    (%r14),%rdx
  movsd  (%rdx,%rax,8),%xmm0
  mulsd  0x0(%rbp,%rax,8),%xmm0
  subsd  %xmm0,%xmm1
L11:
  add    $0x1,%rax
  cmp    %rax,%r13
  jne    L125
  movapd %xmm2,%xmm0
  mulsd  %xmm3,%xmm0
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x0(%rbp,%rbx,8)
  cmp    $0x1,%edi
  je     L149
L46:
  ucomisd %xmm5,%xmm4
  cmovae %r8d,%edi
  add    $0x1,%rbx
  add    $0x8,%r14
  cmp    %rbx,%r13
  jne    L14
L87:
  mov    %edi,%eax
  add    $0x1,%r12d
  xor    $0x1,%eax
  cmp    0x1c(%rsp),%r12d
  setle  %dl
  xor    %edi,%edi
  test   %al,%dl
  jne    L45
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L149:
  ucomisd 0x0(%rbp),%xmm3
  jp     L102
  je     L46
L102:
  movapd %xmm1,%xmm0
  mov    %ecx,0x18(%rsp)
  subsd  %xmm2,%xmm0
  mov    %rsi,0x8(%rsp)
  mov    %edi,0x4(%rsp)
  movsd  %xmm5,0x10(%rsp)
  divsd  %xmm1,%xmm0
  call   <fabs@plt>
  pxor   %xmm4,%xmm4
  mov    0x18(%rsp),%ecx
  xor    %r8d,%r8d
  imul   $0x64,%eax,%eax
  mov    0x8(%rsp),%rsi
  mov    0x4(%rsp),%edi
  pxor   %xmm3,%xmm3
  movsd  0x10(%rsp),%xmm5
  cvtsi2sd %eax,%xmm4
  jmp    L46
```

assistant: ```c
void gauss_seidel(double **m, double *r, double *s, int n, int imax, double es) {
  int i, j, iter, cent;
  double sum, dummy, ea, old, lambda = 1;
  for (i = 0; i <= n - 1; i++) {
    dummy = m[i][i];
    for (j = 0; j <= n - 1; j++) {
      m[i][j] = m[i][j] / dummy;
    }
    r[i] = r[i] / dummy;
  }
  for (i = 0; i <= n - 1; i++) {
    sum = r[i];
    for (j = 0; j <= n - 1; j++) {
      if (i != j)
        sum = sum - m[i][j] * s[j];
    }
    s[i] = sum;
  }
  iter = 1;
  cent = 1;
  do {
    for (i = 0; i <= n - 1; i++) {
      old = s[i];
      sum = r[i];
      for (j = 0; j <= n - 1; j++) {
        if (i != j)
          sum = sum - m[i][j] * s[j];
      }
      s[i] = lambda * sum + (1 - lambda) * old;
      if (cent == 1 && s[0] != 0)
        ea = fabs((s[i] - old) / s[i]) * 100;
      if (ea >= es)
        cent = 0;
    }
    iter += 1;
  } while (cent == 0 && iter <= imax);
}
```