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

```asm
<write_svg_circle>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r13
  mov    %rsi,%r12
  mov    %rdx,%rbx
  mov    %rcx,%rbp
  test   %r8d,%r8d
  je     L42
  movsd  D102(%rip),%xmm0
  movapd %xmm0,%xmm1
  mulsd  (%rdx),%xmm1
  movsd  %xmm1,(%rdx)
  movapd %xmm0,%xmm1
  mulsd  0x8(%rdx),%xmm1
  movsd  %xmm1,0x8(%rdx)
  movapd %xmm0,%xmm1
  mulsd  0x10(%rdx),%xmm1
  movsd  %xmm1,0x10(%rdx)
  movapd %xmm0,%xmm1
  mulsd  0x18(%rdx),%xmm1
  movsd  %xmm1,0x18(%rdx)
  pxor   %xmm1,%xmm1
  cvtsi2sdl (%rcx),%xmm1
  mulsd  %xmm0,%xmm1
  cvttsd2si %xmm1,%eax
  mov    %eax,(%rcx)
  pxor   %xmm1,%xmm1
  cvtsi2sdl 0x4(%rcx),%xmm1
  mulsd  %xmm0,%xmm1
  cvttsd2si %xmm1,%eax
  mov    %eax,0x4(%rcx)
  pxor   %xmm1,%xmm1
  cvtsi2sdl 0x8(%rcx),%xmm1
  mulsd  %xmm0,%xmm1
  cvttsd2si %xmm1,%eax
  mov    %eax,0x8(%rcx)
  pxor   %xmm1,%xmm1
  cvtsi2sdl 0xc(%rcx),%xmm1
  mulsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%eax
  mov    %eax,0xc(%rcx)
L42:
  pxor   %xmm0,%xmm0
  cvtsi2sdl 0x0(%rbp),%xmm0
  subsd  (%rbx),%xmm0
  cvttsd2si %xmm0,%esi
  pxor   %xmm0,%xmm0
  cvtsi2sdl 0x4(%rbp),%xmm0
  subsd  0x8(%rbx),%xmm0
  cvttsd2si %xmm0,%edi
  call   <atan2@plt>
  movsd  %xmm0,0x8(%rsp)
  pxor   %xmm0,%xmm0
  cvtsi2sdl 0x8(%rbp),%xmm0
  subsd  (%rbx),%xmm0
  cvttsd2si %xmm0,%esi
  pxor   %xmm0,%xmm0
  cvtsi2sdl 0xc(%rbp),%xmm0
  subsd  0x8(%rbx),%xmm0
  cvttsd2si %xmm0,%edi
  call   <atan2@plt>
  movapd %xmm0,%xmm1
  movsd  %xmm0,0x10(%rsp)
  movsd  D72(%rip),%xmm0
  movapd %xmm0,%xmm4
  mulsd  0x10(%rbx),%xmm4
  movsd  %xmm4,0x18(%rsp)
  movsd  0x8(%rsp),%xmm0
  call   <angle_diff@plt>
  movapd %xmm0,%xmm1
  movsd  D111(%rip),%xmm0
  divsd  0x18(%rsp),%xmm0
  comisd %xmm1,%xmm0
  ja     L66
L3:
  lea    0x28(%rsp),%r14
  lea    0x20(%rsp),%r15
  mov    %r15,%rsi
  mov    %r14,%rdi
  movsd  0x10(%rsp),%xmm0
  call   <sincos@plt>
  mov    0x20(%rsp),%rbp
  movsd  0x28(%rsp),%xmm7
  movsd  %xmm7,0x18(%rsp)
  mov    %r15,%rsi
  mov    %r14,%rdi
  movsd  0x8(%rsp),%xmm0
  call   <sincos@plt>
  movsd  0x10(%rbx),%xmm2
  movsd  (%rbx),%xmm4
  movapd %xmm2,%xmm5
  mulsd  0x20(%rsp),%xmm5
  movapd %xmm5,%xmm0
  addsd  %xmm4,%xmm0
  movsd  0x8(%rbx),%xmm3
  movapd %xmm2,%xmm1
  mulsd  0x28(%rsp),%xmm1
  addsd  %xmm3,%xmm1
  movq   %rbp,%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm4,%xmm5
  movsd  0x18(%rsp),%xmm6
  mulsd  %xmm2,%xmm6
  addsd  %xmm3,%xmm6
  pxor   %xmm3,%xmm3
  movsd  0x8(%rsp),%xmm7
  comisd %xmm7,%xmm3
  ja     L46
L50:
  pxor   %xmm3,%xmm3
  movsd  0x10(%rsp),%xmm4
  comisd %xmm4,%xmm3
  ja     L12
L48:
  movsd  0x8(%rsp),%xmm3
  movsd  0x10(%rsp),%xmm7
  comisd %xmm7,%xmm3
  jbe    L36
  addsd  D72(%rip),%xmm7
  movsd  %xmm7,0x10(%rsp)
L36:
  movsd  0x10(%rsp),%xmm3
  subsd  0x8(%rsp),%xmm3
  comisd D47(%rip),%xmm3
  seta   %dl
  movzbl %dl,%edx
  mov    $0x1,%ecx
  pxor   %xmm4,%xmm4
  movapd %xmm2,%xmm3
  lea    D31(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x7,%eax
  call   <fprintf@plt>
  movsd  D88(%rip),%xmm0
  lea    D16(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x1,%eax
  call   <fprintf@plt>
L11:
  movsd  0x10(%rsp),%xmm6
  movsd  0x8(%rsp),%xmm5
  movsd  0x20(%rbx),%xmm4
  movsd  0x18(%rbx),%xmm3
  movsd  0x10(%rbx),%xmm2
  movsd  0x8(%rbx),%xmm1
  movsd  (%rbx),%xmm0
  lea    D119(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x7,%eax
  call   <fprintf@plt>
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L66:
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  call   <angle_diff_signed@plt>
  test   %rax,%rax
  jle    L3
  mov    $0x1,%edx
  movsd  0x18(%rbx),%xmm3
  movsd  0x10(%rbx),%xmm2
  movsd  0x8(%rbx),%xmm1
  movsd  (%rbx),%xmm0
  lea    D5(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x4,%eax
  call   <fprintf@plt>
  jmp    L11
L46:
  addsd  D72(%rip),%xmm7
  movsd  %xmm7,0x8(%rsp)
  jmp    L50
L12:
  addsd  D72(%rip),%xmm4
  movsd  %xmm4,0x10(%rsp)
  jmp    L48
```

tool_calls: name: disassemble_data
arguments: tag: D102
type_guessed: f64
name: disassemble_data
arguments: tag: D72
type_guessed: f64
name: disassemble_data
arguments: tag: D111
type_guessed: byte[8]
name: disassemble_data
arguments: tag: D47
type_guessed: f64[2]
name: disassemble_data
arguments: tag: D31
type_guessed: string
name: disassemble_data
arguments: tag: D88
type_guessed: f32[2]
name: disassemble_data
arguments: tag: D16
type_guessed: string
name: disassemble_data
arguments: tag: D119
type_guessed: string
name: disassemble_data
arguments: tag: D5
type_guessed: string

tool: D102: 1.25

tool: D72: 6.28318530718

tool: {"D111": [0x2d,0x64,0xdd,0x1a,0x83,0xc5,0x21,0x40]}

tool: {"D47": [3.141592653589793,1.0]}

tool: D31: <path d="M %f,%f A%f,%f %f %d,%d %f,%f"

tool: {"D88": [0.0,1.875]}

tool: D16:  fill="none" stroke ="blue" stroke-width="%d" />


tool: D119: %f %f %f %f %f %f %f


tool: D5: <ellipse cx="%f" cy="%f" rx="%f" ry="%f" stroke="blue" stroke-width="%d" fill="none" /> 


assistant: ```c
void write_svg_circle(FILE *fe, FILE *svg, double *param, int *pext, int smooth) {
  int fa = 0, fs = 1;
  double ang_start, ang_end;
  if (smooth) {
    param[0] *= 1.25;
    param[1] *= 1.25;
    param[2] *= 1.25;
    param[3] *= 1.25;
    pext[0] *= 1.25;
    pext[1] *= 1.25;
    pext[2] *= 1.25;
    pext[3] *= 1.25;
  }
  ang_start = atan2(pext[1] - param[1], pext[0] - param[0]);
  ang_end = atan2(pext[3] - param[1], pext[2] - param[0]);
  double C = 6.28318530718 * param[2];
  if (angle_diff(ang_start, ang_end) < 6.28318530718 * 1.414213562373095 / C && angle_diff_signed(ang_start, ang_end) > 0) {
    fprintf(svg, "<ellipse cx=\"%f\" cy=\"%f\" rx=\"%f\" ry=\"%f\" stroke=\"blue\" stroke-width=\"%d\" fill=\"none\" /> \n", param[0], param[1], param[2], param[3], 1);
  } else {
    double x1, y1, x2, y2;
    x1 = param[2] * cos(ang_start) + param[0];
    y1 = param[2] * sin(ang_start) + param[1];
    x2 = param[2] * cos(ang_end) + param[0];
    y2 = param[2] * sin(ang_end) + param[1];
    if (ang_start < 0)
      ang_start += 6.28318530718;
    if (ang_end < 0)
      ang_end += 6.28318530718;
    if (ang_end < ang_start)
      ang_end += 6.28318530718;
    if ((ang_end - ang_start) > 3.14159265358979323846)
      fa = 1;
    fprintf(svg, "<path d=\"M %f,%f A%f,%f %f %d,%d %f,%f\"", x1, y1, param[2], param[2], 0.0, fa, fs, x2, y2);
    fprintf(svg, " fill=\"none\" stroke =\"blue\" stroke-width=\"%d\" />\n", 1);
  }
  fprintf(fe, "%f %f %f %f %f %f %f\n", param[0], param[1], param[2], param[3], param[4], ang_start, ang_end);
}
```