user: Demonstrate the C code that generates the assembly output below:

```asm
<ks_prob>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %edi,-0x14(%rbp)
  movsd  %xmm0,-0x20(%rbp)
  movsd  %xmm1,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jg     L5
  lea    D100(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D61(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%edi
  call   <exit@plt>
L5:
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x14(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  D92(%rip),%xmm0
  comisd -0x20(%rbp),%xmm0
  jbe    L44
  mov    -0x30(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L60
L44:
  movsd  -0x20(%rbp),%xmm0
  comisd D109(%rip),%xmm0
  jbe    L70
  mov    -0x30(%rbp),%rax
  movsd  D115(%rip),%xmm0
  movsd  %xmm0,(%rax)
  jmp    L60
L70:
  movsd  -0x20(%rbp),%xmm1
  movsd  D22(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x20(%rbp),%xmm0
  movapd %xmm0,%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,-0x48(%rbp)
  mov    -0x8(%rbp),%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movsd  D125(%rip),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  -0x48(%rbp),%xmm1
  divsd  %xmm0,%xmm1
  movsd  D115(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movsd  -0x40(%rbp),%xmm1
  mulsd  %xmm0,%xmm1
  movsd  D115(%rip),%xmm0
  subsd  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  movsd  %xmm0,(%rax)
L60:
  movsd  D92(%rip),%xmm0
  comisd -0x28(%rbp),%xmm0
  jbe    L88
  mov    -0x38(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L2
L88:
  movsd  -0x28(%rbp),%xmm0
  comisd D109(%rip),%xmm0
  jbe    L43
  mov    -0x38(%rbp),%rax
  movsd  D115(%rip),%xmm0
  movsd  %xmm0,(%rax)
  jmp    L2
L43:
  movsd  -0x28(%rbp),%xmm1
  movsd  D22(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mulsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x28(%rbp),%xmm0
  movapd %xmm0,%xmm3
  addsd  %xmm0,%xmm3
  movsd  %xmm3,-0x48(%rbp)
  mov    -0x8(%rbp),%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movsd  D125(%rip),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  -0x48(%rbp),%xmm1
  divsd  %xmm0,%xmm1
  movsd  D115(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movsd  -0x40(%rbp),%xmm1
  mulsd  %xmm0,%xmm1
  movsd  D115(%rip),%xmm0
  subsd  %xmm1,%xmm0
  mov    -0x38(%rbp),%rax
  movsd  %xmm0,(%rax)
L2:
  nop
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D100
type: string
name: extract_symbolic_data
arguments: tag: D61
type: string
name: extract_symbolic_data
arguments: tag: D92
type: byte[8]
name: extract_symbolic_data
arguments: tag: D109
type: f64[2]
name: extract_symbolic_data
arguments: tag: D115
type: f64
name: extract_symbolic_data
arguments: tag: D22
type: f32[2]
name: extract_symbolic_data
arguments: tag: D125
type: f64

tool: D100: Error in ks_prob: argument out of range


tool: D61: Program aborted



tool: {"D92": [0x3a,0x8c,0x30,0xe2,0x8e,0x79,0x45,0x3e]}

tool: {"D109": [3.5,1.0]}

tool: D115: 1

tool: {"D22": [0.0,-2.0]}

tool: D125: 3

assistant: ```c
void ks_prob(int n, double kp, double km, double *pp, double *pm) {
  double xn;
  if (n <= 0) {
    printf("Error in ks_prob: argument out of range\n");
    printf("Program aborted\n\n");
    exit(0);
  }
  xn = (double)n;
  if (kp < 1e-8)
    *pp = 0.0;
  else if (kp > 3.5)
    *pp = 1.0;
  else
    *pp = 1.0 - exp(-2.0 * kp * kp) * (1.0 - 2.0 * kp / (3.0 * sqrt(xn)));
  if (km < 1e-8)
    *pm = 0.0;
  else if (km > 3.5)
    *pm = 1.0;
  else
    *pm = 1.0 - exp(-2.0 * km * km) * (1.0 - 2.0 * km / (3.0 * sqrt(xn)));
}
```