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

```asm
<FixCollision>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %rdi,-0x88(%rbp)
  mov    %esi,-0x8c(%rbp)
  mov    %edx,-0x90(%rbp)
  mov    %ecx,-0x94(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x94(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x90(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x70(%rbp)
  mov    -0x90(%rbp),%eax
  mov    %eax,-0x78(%rbp)
  jmp    L72
L110:
  mov    -0x78(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x78(%rbp),%eax
  add    $0x2,%eax
  cltq
  lea    0x1(%rax),%rcx
  mov    -0x88(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x6c(%rbp)
  mov    -0x78(%rbp),%eax
  cltq
  lea    0x4(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x78(%rbp),%eax
  add    $0x4,%eax
  cltq
  lea    0x1(%rax),%rcx
  mov    -0x88(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x68(%rbp)
  mov    -0x78(%rbp),%eax
  cltq
  lea    0x6(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x78(%rbp),%eax
  add    $0x6,%eax
  cltq
  lea    0x1(%rax),%rcx
  mov    -0x88(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x64(%rbp)
  movl   $0x0,-0x7c(%rbp)
  jmp    L36
L25:
  mov    -0x6c(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  add    %eax,%edx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x6c(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  add    %eax,%edx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %ecx,%eax
  movswl %ax,%edx
  mov    -0x7c(%rbp),%eax
  cltq
  mov    %edx,-0x44(%rbp,%rax,4)
  mov    -0x68(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  add    %eax,%edx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x68(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  add    %eax,%edx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %ecx,%eax
  movswl %ax,%edx
  mov    -0x7c(%rbp),%eax
  cltq
  mov    %edx,-0x38(%rbp,%rax,4)
  mov    -0x64(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  add    %eax,%edx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x64(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  add    %eax,%edx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %ecx,%eax
  movswl %ax,%edx
  mov    -0x7c(%rbp),%eax
  cltq
  mov    %edx,-0x2c(%rbp,%rax,4)
  addl   $0x1,-0x7c(%rbp)
L36:
  cmpl   $0x2,-0x7c(%rbp)
  jle    L25
  mov    -0x44(%rbp),%eax
  mov    -0x38(%rbp),%edx
  sub    %edx,%eax
  mov    %eax,-0x5c(%rbp)
  mov    -0x38(%rbp),%eax
  mov    -0x2c(%rbp),%edx
  sub    %edx,%eax
  mov    %eax,-0x58(%rbp)
  mov    -0x40(%rbp),%eax
  mov    -0x34(%rbp),%edx
  sub    %edx,%eax
  mov    %eax,-0x54(%rbp)
  mov    -0x34(%rbp),%eax
  mov    -0x28(%rbp),%edx
  sub    %edx,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    -0x30(%rbp),%edx
  sub    %edx,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x30(%rbp),%eax
  mov    -0x24(%rbp),%edx
  sub    %edx,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x54(%rbp),%edx
  mov    -0x48(%rbp),%eax
  imul   %edx,%eax
  mov    -0x4c(%rbp),%ecx
  mov    -0x50(%rbp),%edx
  imul   %ecx,%edx
  sub    %edx,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x4c(%rbp),%edx
  mov    -0x58(%rbp),%eax
  imul   %edx,%eax
  mov    -0x5c(%rbp),%ecx
  mov    -0x48(%rbp),%edx
  imul   %ecx,%edx
  sub    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x5c(%rbp),%edx
  mov    -0x50(%rbp),%eax
  imul   %edx,%eax
  mov    -0x54(%rbp),%ecx
  mov    -0x58(%rbp),%edx
  imul   %ecx,%edx
  sub    %edx,%eax
  mov    %eax,-0x18(%rbp)
  movl   $0x0,-0x7c(%rbp)
  jmp    L151
L40:
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%eax
  pxor   %xmm1,%xmm1
  cvtsi2ss %eax,%xmm1
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x7c(%rbp),%eax
  cltq
  movss  %xmm0,-0x14(%rbp,%rax,4)
  addl   $0x1,-0x7c(%rbp)
L151:
  cmpl   $0x2,-0x7c(%rbp)
  jle    L40
  movss  -0x14(%rbp),%xmm1
  movss  -0x10(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  -0xc(%rbp),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x60(%rbp)
  movl   $0x0,-0x7c(%rbp)
  jmp    L138
L63:
  pxor   %xmm0,%xmm0
  ucomiss -0x60(%rbp),%xmm0
  jp     L95
  pxor   %xmm0,%xmm0
  ucomiss -0x60(%rbp),%xmm0
  je     L108
L95:
  mov    -0x7c(%rbp),%eax
  cltq
  movss  -0x14(%rbp,%rax,4),%xmm0
  divss  -0x60(%rbp),%xmm0
  mov    -0x7c(%rbp),%eax
  cltq
  movss  %xmm0,-0x14(%rbp,%rax,4)
L108:
  mov    -0x7c(%rbp),%eax
  cltq
  movss  -0x14(%rbp,%rax,4),%xmm1
  movss  D38(%rip),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x7c(%rbp),%eax
  cltq
  movss  %xmm0,-0x14(%rbp,%rax,4)
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x14(%rbp,%rax,4),%eax
  movd   %eax,%xmm0
  call   <sqrt@plt>
  movd   %xmm0,%eax
  mov    -0x7c(%rbp),%edx
  movslq %edx,%rdx
  mov    %eax,-0x14(%rbp,%rdx,4)
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%eax
  test   %eax,%eax
  jns    L28
  mov    -0x7c(%rbp),%eax
  cltq
  movss  -0x14(%rbp,%rax,4),%xmm0
  movss  D22(%rip),%xmm1
  xorps  %xmm1,%xmm0
  mov    -0x7c(%rbp),%eax
  cltq
  movss  %xmm0,-0x14(%rbp,%rax,4)
L28:
  addl   $0x1,-0x7c(%rbp)
L138:
  cmpl   $0x2,-0x7c(%rbp)
  jle    L63
  movss  -0x14(%rbp),%xmm1
  mov    -0x44(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mulss  %xmm1,%xmm0
  movss  D11(%rip),%xmm2
  movaps %xmm0,%xmm1
  divss  %xmm2,%xmm1
  movss  -0x10(%rbp),%xmm2
  mov    -0x40(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mulss  %xmm2,%xmm0
  movss  D11(%rip),%xmm2
  divss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0xc(%rbp),%xmm2
  mov    -0x3c(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mulss  %xmm2,%xmm0
  movss  D11(%rip),%xmm2
  divss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  cvttss2si %xmm0,%eax
  neg    %eax
  mov    %eax,-0x74(%rbp)
  cmpl   $0x0,-0x74(%rbp)
  jns    L84
  addl   $0x10000,-0x74(%rbp)
L84:
  mov    -0x74(%rbp),%eax
  sar    $0x8,%eax
  mov    %eax,%edx
  mov    -0x78(%rbp),%eax
  cltq
  lea    0xe(%rax),%rcx
  mov    -0x88(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x78(%rbp),%eax
  cltq
  lea    0xf(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  mov    -0x74(%rbp),%edx
  mov    %dl,(%rax)
  andl   $0xffff,-0x74(%rbp)
  movl   $0x0,-0x7c(%rbp)
  jmp    L97
L22:
  mov    -0x7c(%rbp),%eax
  cltq
  movss  -0x14(%rbp,%rax,4),%xmm0
  cvttss2si %xmm0,%edx
  mov    -0x7c(%rbp),%eax
  cltq
  mov    %edx,-0x20(%rbp,%rax,4)
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%eax
  test   %eax,%eax
  jns    L153
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%eax
  lea    0x10000(%rax),%edx
  mov    -0x7c(%rbp),%eax
  cltq
  mov    %edx,-0x20(%rbp,%rax,4)
L153:
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%eax
  movzwl %ax,%edx
  mov    -0x7c(%rbp),%eax
  cltq
  mov    %edx,-0x20(%rbp,%rax,4)
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%eax
  sar    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%eax
  lea    0x8(%rax),%edx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x7c(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%edx
  mov    -0x78(%rbp),%eax
  lea    0x9(%rax),%ecx
  mov    -0x7c(%rbp),%eax
  add    %eax,%eax
  add    %ecx,%eax
  movslq %eax,%rcx
  mov    -0x88(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addl   $0x1,-0x7c(%rbp)
L97:
  cmpl   $0x2,-0x7c(%rbp)
  jle    L22
  addl   $0x10,-0x78(%rbp)
L72:
  mov    -0x78(%rbp),%eax
  cmp    -0x70(%rbp),%eax
  jl     L110
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L124
  call   <__stack_chk_fail@plt>
L124:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D38
data_type: byte[4]
name: retrieve_data
arguments: label: D22
data_type: byte[4]
name: retrieve_data
arguments: label: D11
data_type: byte[4]

tool: {"D38": [0x00,0xfc,0x7f,0x4e]}

tool: {"D22": [0x00,0x00,0x00,0x80]}

tool: {"D11": [0x00,0xfe,0xff,0x46]}

assistant: ```c
void FixCollision(unsigned char *data, int vertOff, int TriOff, int TriCount) {
  int i, pos, end = TriOff + (TriCount << 4);
  int v1, v2, v3, p1[3], p2[3], p3[3], dx[2], dy[2], dz[2], dn, ni[3];
  float nf[3], nd;
  for (pos = TriOff; pos < end; pos += 0x10) {
    v1 = (((data)[pos + 2] << 8) | ((data)[pos + 2 + 1]));
    v2 = (((data)[pos + 4] << 8) | ((data)[pos + 4 + 1]));
    v3 = (((data)[pos + 6] << 8) | ((data)[pos + 6 + 1]));
    for (i = 0; i < 3; i++) {
      p1[i] = (signed short)(((data)[vertOff + (v1 * 0x6) + (i << 1)] << 8) | ((data)[vertOff + (v1 * 0x6) + (i << 1) + 1]));
      p2[i] = (signed short)(((data)[vertOff + (v2 * 0x6) + (i << 1)] << 8) | ((data)[vertOff + (v2 * 0x6) + (i << 1) + 1]));
      p3[i] = (signed short)(((data)[vertOff + (v3 * 0x6) + (i << 1)] << 8) | ((data)[vertOff + (v3 * 0x6) + (i << 1) + 1]));
    }
    dx[0] = p1[0] - p2[0];
    dx[1] = p2[0] - p3[0];
    dy[0] = p1[1] - p2[1];
    dy[1] = p2[1] - p3[1];
    dz[0] = p1[2] - p2[2];
    dz[1] = p2[2] - p3[2];
    ni[0] = (dy[0] * dz[1]) - (dz[0] * dy[1]);
    ni[1] = (dz[0] * dx[1]) - (dx[0] * dz[1]);
    ni[2] = (dx[0] * dy[1]) - (dy[0] * dx[1]);
    for (i = 0; i < 3; i++)
      nf[i] = (float)ni[i] * ni[i];
    nd = nf[0] + nf[1] + nf[2];
    for (i = 0; i < 3; i++) {
      if (nd)
        nf[i] /= nd;
      nf[i] *= 0x3FFF0001;
      nf[i] = sqrt(nf[i]);
      if (ni[i] < 0)
        nf[i] *= -1;
    }
    dn = (int)((nf[0] * p1[0] / 0x7FFF) + (nf[1] * p1[1] / 0x7FFF) + (nf[2] * p1[2] / 0x7FFF)) * -1;
    if (dn < 0)
      dn += 0x10000;
    data[pos + 0xE] = (dn >> 8) & 0xFF;
    data[pos + 0xF] = dn & 0xFF;
    dn &= 0xFFFF;
    for (i = 0; i < 3; i++) {
      ni[i] = (int)nf[i];
      if (ni[i] < 0)
        ni[i] += 0x10000;
      ni[i] &= 0xFFFF;
      data[pos + 8 + (i << 1)] = (ni[i] >> 8) & 0xFF;
      data[pos + 9 + (i << 1)] = ni[i] & 0xFF;
    }
  }
}
```