user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<matrix_multiply_block>:
  endbr64
  mov    %r9d,%eax
  mov    %ecx,%ecx
  mov    %r8d,%r8d
  push   %r12
  lea    0x0(,%rcx,8),%r9
  push   %rbp
  mov    %rdi,%r10
  lea    0x8(%rdx),%rcx
  push   %rbx
  lea    0x0(,%r8,8),%r11
  mov    %rsi,%rbx
  lea    0x0(,%rax,8),%rbp
  lea    0x100(%rsi),%r12
L49:
  lea    -0x8(%rcx),%rsi
  mov    %rbx,%r8
  mov    %r10,%rax
  mov    $0x20,%edi
  jmp    L41
  nopl   (%rax)
L11:
  movapd %xmm1,%xmm0
  movupd -0x8(%rcx),%xmm1
  movupd (%rax),%xmm2
  add    %r11,%r8
  unpcklpd %xmm0,%xmm0
  movupd 0x10(%rax),%xmm3
  movupd 0x20(%rax),%xmm4
  mulpd  %xmm0,%xmm1
  movupd 0x30(%rax),%xmm5
  movupd 0x40(%rax),%xmm6
  movupd 0x50(%rax),%xmm7
  addpd  %xmm2,%xmm1
  movupd 0x60(%rax),%xmm2
  movups %xmm1,(%rax)
  movupd 0x8(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm3,%xmm1
  movupd 0x70(%rax),%xmm3
  movups %xmm1,0x10(%rax)
  movupd 0x18(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm4,%xmm1
  movupd 0x80(%rax),%xmm4
  movups %xmm1,0x20(%rax)
  movupd 0x28(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm5,%xmm1
  movupd 0x90(%rax),%xmm5
  movups %xmm1,0x30(%rax)
  movupd 0x38(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm6,%xmm1
  movupd 0xa0(%rax),%xmm6
  movups %xmm1,0x40(%rax)
  movupd 0x48(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm7,%xmm1
  movups %xmm1,0x50(%rax)
  movupd 0x58(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm2,%xmm1
  movups %xmm1,0x60(%rax)
  movupd 0x68(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm3,%xmm1
  movups %xmm1,0x70(%rax)
  movupd 0x78(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm4,%xmm1
  movups %xmm1,0x80(%rax)
  movupd 0x88(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm5,%xmm1
  movups %xmm1,0x90(%rax)
  movupd 0x98(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm6,%xmm1
  movups %xmm1,0xa0(%rax)
  movupd 0xa8(%rcx),%xmm1
  movupd 0xb0(%rax),%xmm7
  movupd 0xc0(%rax),%xmm2
  movupd 0xd0(%rax),%xmm3
  mulpd  %xmm0,%xmm1
  movupd 0xe0(%rax),%xmm4
  movupd 0xf0(%rax),%xmm6
  addpd  %xmm7,%xmm1
  movups %xmm1,0xb0(%rax)
  movupd 0xb8(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm2,%xmm1
  movups %xmm1,0xc0(%rax)
  movupd 0xc8(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm3,%xmm1
  movups %xmm1,0xd0(%rax)
  movupd 0xd8(%rcx),%xmm1
  mulpd  %xmm0,%xmm1
  addpd  %xmm4,%xmm1
  movups %xmm1,0xe0(%rax)
  movupd 0xe8(%rcx),%xmm5
  mulpd  %xmm5,%xmm0
  addpd  %xmm6,%xmm0
  movups %xmm0,0xf0(%rax)
  add    %r9,%rax
  sub    $0x1,%edi
  je     L51
L41:
  movsd  (%r8),%xmm1
  cmp    %rcx,%rax
  jne    L11
  xor    %edx,%edx
  cs nopw 0x0(%rax,%rax,1)
L52:
  movsd  (%rsi,%rdx,1),%xmm0
  mulsd  %xmm1,%xmm0
  addsd  (%rax,%rdx,1),%xmm0
  movsd  %xmm0,(%rax,%rdx,1)
  add    $0x8,%rdx
  cmp    $0x100,%rdx
  jne    L52
  add    %r9,%rax
  add    %r11,%r8
  sub    $0x1,%edi
  jne    L41
L51:
  add    $0x8,%rbx
  add    %rbp,%rcx
  cmp    %rbx,%r12
  jne    L49
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
```

assistant: ```c
void matrix_multiply_block(double C[], const double A[], const double B[], const unsigned int ldc, const unsigned int lda, const unsigned int ldb) {
  unsigned int i, j, k;
  const double *B_k = B;
  for (k = 0; k < 32; ++k) {
    double *C_i = C;
    const double *Ap = A + k;
    for (i = 0; i < 32; ++i) {
      const double A_i_k = *Ap;
      for (j = 0; j < 32; ++j) {
        C_i[j] += A_i_k * B_k[j];
      }
      C_i += ldc;
      Ap += lda;
    }
    B_k += ldb;
  }
}
```