user: 请从给定的汇编指令推导出C源代码:

```asm
<MagellanMultiplicationMatrix>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %rsi,-0xa0(%rbp)
  mov    %rdx,-0xa8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x90(%rbp)
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x88(%rbp)
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0xa8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xa8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  -0x58(%rbp),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  movsd  D9(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    -0x90(%rbp),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rdx,(%rax)
  mov    $0x1,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L2
  call   <__stack_chk_fail@plt>
L2:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D9
data_type: f64

tool: D9: 1

assistant: ```c
int MagellanMultiplicationMatrix(MatrixA, MatrixB, MatrixC)
double MatrixA[4][4], MatrixB[4][4], MatrixC[4][4];
{
  double MatrixR[4][4];
  MatrixR[0][0] = MatrixB[0][0] * MatrixC[0][0] + MatrixB[0][1] * MatrixC[1][0] + MatrixB[0][2] * MatrixC[2][0];
  MatrixR[0][1] = MatrixB[0][0] * MatrixC[0][1] + MatrixB[0][1] * MatrixC[1][1] + MatrixB[0][2] * MatrixC[2][1];
  MatrixR[0][2] = MatrixB[0][0] * MatrixC[0][2] + MatrixB[0][1] * MatrixC[1][2] + MatrixB[0][2] * MatrixC[2][2];
  MatrixR[1][0] = MatrixB[1][0] * MatrixC[0][0] + MatrixB[1][1] * MatrixC[1][0] + MatrixB[1][2] * MatrixC[2][0];
  MatrixR[1][1] = MatrixB[1][0] * MatrixC[0][1] + MatrixB[1][1] * MatrixC[1][1] + MatrixB[1][2] * MatrixC[2][1];
  MatrixR[1][2] = MatrixB[1][0] * MatrixC[0][2] + MatrixB[1][1] * MatrixC[1][2] + MatrixB[1][2] * MatrixC[2][2];
  MatrixR[2][0] = MatrixB[2][0] * MatrixC[0][0] + MatrixB[2][1] * MatrixC[1][0] + MatrixB[2][2] * MatrixC[2][0];
  MatrixR[2][1] = MatrixB[2][0] * MatrixC[0][1] + MatrixB[2][1] * MatrixC[1][1] + MatrixB[2][2] * MatrixC[2][1];
  MatrixR[2][2] = MatrixB[2][0] * MatrixC[0][2] + MatrixB[2][1] * MatrixC[1][2] + MatrixB[2][2] * MatrixC[2][2];
  MatrixR[0][3] = MatrixR[1][3] = MatrixR[2][3] = MatrixR[3][0] = MatrixR[3][1] = MatrixR[3][2] = 0.0;
  MatrixR[3][3] = 1.0;
  memcpy(MatrixA, MatrixR, sizeof(MatrixA));
  return (1 == 1);
}
```