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

```asm
<BSbisection>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %edi,%r14d
  movsd  %xmm0,0x18(%rsp)
  movq   %xmm1,%r13
  movq   %xmm2,%r12
  movq   %xmm3,%rbp
  movsd  %xmm4,0x20(%rsp)
  movsd  %xmm5,0x28(%rsp)
  mov    $0x65,%r15d
  mov    D34(%rip),%rbx
  movsd  D31(%rip),%xmm5
  movsd  %xmm5,0x8(%rsp)
  jmp    L38
L68:
  ucomisd %xmm1,%xmm1
  mov    $0x0,%edi
  jnp    L137
L11:
  call   <assert@plt>
  movsd  0x10(%rsp),%xmm5
  movsd  0x20(%rsp),%xmm4
  movq   %rbp,%xmm3
  movq   %r12,%xmm2
  movq   %r13,%xmm1
  movsd  0x18(%rsp),%xmm0
  mov    %r14d,%edi
  call   <BSAmericanApprox@plt>
  movsd  0x28(%rsp),%xmm6
  movapd %xmm6,%xmm1
  subsd  %xmm0,%xmm1
  andpd  D30(%rip),%xmm1
  movsd  D73(%rip),%xmm2
  comisd %xmm1,%xmm2
  jae    L53
  movapd %xmm0,%xmm1
  cmpltsd %xmm6,%xmm1
  movq   %rbx,%xmm2
  andpd  %xmm1,%xmm2
  movsd  0x10(%rsp),%xmm7
  andnpd %xmm7,%xmm1
  orpd   %xmm2,%xmm1
  movq   %xmm1,%rbx
  cmpltsd %xmm6,%xmm0
  andpd  %xmm0,%xmm7
  movsd  0x8(%rsp),%xmm5
  andnpd %xmm5,%xmm0
  orpd   %xmm7,%xmm0
  movsd  %xmm0,0x8(%rsp)
  sub    $0x1,%r15d
  je     L90
L38:
  movsd  0x8(%rsp),%xmm5
  movsd  0x20(%rsp),%xmm4
  movq   %rbp,%xmm3
  movq   %r12,%xmm2
  movq   %r13,%xmm1
  movsd  0x18(%rsp),%xmm0
  mov    %r14d,%edi
  call   <BSAmericanApprox@plt>
  movsd  %xmm0,0x10(%rsp)
  movq   %rbx,%xmm5
  movsd  0x20(%rsp),%xmm4
  movq   %rbp,%xmm3
  movq   %r12,%xmm2
  movq   %r13,%xmm1
  movsd  0x18(%rsp),%xmm0
  mov    %r14d,%edi
  call   <BSAmericanApprox@plt>
  movsd  0x10(%rsp),%xmm3
  movsd  0x28(%rsp),%xmm1
  comisd %xmm1,%xmm3
  ja     L136
  comisd %xmm0,%xmm1
  ja     L36
  subsd  %xmm3,%xmm1
  movq   %rbx,%xmm2
  movsd  0x8(%rsp),%xmm4
  subsd  %xmm4,%xmm2
  mulsd  %xmm2,%xmm1
  subsd  %xmm3,%xmm0
  divsd  %xmm0,%xmm1
  addsd  %xmm4,%xmm1
  movsd  %xmm1,0x10(%rsp)
  movsd  D31(%rip),%xmm5
  comisd %xmm1,%xmm5
  ja     L62
  comisd D34(%rip),%xmm1
  jbe    L68
  movsd  D34(%rip),%xmm7
  movsd  %xmm7,0x10(%rsp)
  jmp    L88
L137:
  mov    $0x0,%edi
  comisd %xmm5,%xmm1
  jb     L11
  movsd  D34(%rip),%xmm0
  comisd %xmm1,%xmm0
  setae  %dil
  movzbl %dil,%edi
  jmp    L11
L90:
  pxor   %xmm5,%xmm5
  movsd  %xmm5,0x10(%rsp)
  jmp    L53
L136:
  pxor   %xmm7,%xmm7
  movsd  %xmm7,0x10(%rsp)
L53:
  movsd  0x10(%rsp),%xmm0
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L36:
  movsd  D34(%rip),%xmm5
  movsd  %xmm5,0x10(%rsp)
  jmp    L53
L62:
  movsd  D31(%rip),%xmm5
  movsd  %xmm5,0x10(%rsp)
L88:
  mov    $0x1,%edi
  jmp    L11
```

tool_calls: name: disassemble_data
arguments: data_label: D34
type_guessed: f64[2]
name: disassemble_data
arguments: data_label: D31
type_guessed: f64
name: disassemble_data
arguments: data_label: D30
type_guessed: qword[2]
name: disassemble_data
arguments: data_label: D73
type_guessed: f64

tool: {"D34": [100.99999,1e-7]}

tool: D31: 1e-07

tool: {"D30": [0x7fffffffffffffff,0x0000000000000000]}

tool: D73: 1e-06

assistant: ```c
extern double BSbisection(int fCall, double S, double X, double T, double r, double b, double price) {
  double vLow = 0.0000001;
  double vHigh = 100.99999, cLow, cHigh;
  double epsilon = 0.000001;
  double val, diff, vi = 0.0;
  int counter = 0;
  for (;;) {
    cLow = BSAmericanApprox(fCall, S, X, T, r, b, vLow);
    cHigh = BSAmericanApprox(fCall, S, X, T, r, b, vHigh);
    if (price < cLow)
      return 0.0;
    else if (price > cHigh)
      return 100.99999;
    vi = vLow + (price - cLow) * (vHigh - vLow) / (cHigh - cLow);
    if (vi < 0.0000001)
      vi = 0.0000001;
    else if (vi > 100.99999)
      vi = 100.99999;
    assert(((vi) == (vi)) && (vi) >= 0.0000001 && vi <= 100.99999);
    val = BSAmericanApprox(fCall, S, X, T, r, b, vi);
    diff = price - val;
    if (fabs(diff) <= epsilon)
      break;
    else if (val < price)
      vLow = vi;
    else
      vHigh = vi;
    if (counter++ >= 100)
      return 0;
  }
  return vi;
}
```