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

```asm
<ffu4fstr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  movsd  %xmm0,-0x38(%rbp)
  movsd  %xmm1,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %r8,-0x58(%rbp)
  mov    %r9,-0x60(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  movsd  D5(%rip),%xmm0
  ucomisd -0x38(%rbp),%xmm0
  jp     L72
  movsd  D5(%rip),%xmm0
  ucomisd -0x38(%rbp),%xmm0
  jne    L72
  pxor   %xmm0,%xmm0
  ucomisd -0x40(%rbp),%xmm0
  jp     L72
  pxor   %xmm0,%xmm0
  ucomisd -0x40(%rbp),%xmm0
  jne    L72
  movq   $0x0,-0x18(%rbp)
  jmp    L62
L58:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  js     L92
  pxor   %xmm2,%xmm2
  cvtsi2sd %rax,%xmm2
  movq   %xmm2,%rax
  jmp    L70
L92:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm0,%xmm0
  cvtsi2sd %rdx,%xmm0
  addsd  %xmm0,%xmm0
  movq   %xmm0,%rax
L70:
  mov    -0x48(%rbp),%rcx
  mov    -0x58(%rbp),%rdx
  movq   %rax,%xmm0
  mov    %rcx,%rsi
  mov    %rdx,%rdi
  call   <sprintf@plt>
  mov    -0x50(%rbp),%rax
  add    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L134
  mov    -0x60(%rbp),%rax
  movl   $0xfffffff5,(%rax)
L134:
  addq   $0x1,-0x18(%rbp)
L62:
  mov    -0x18(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jl     L58
  jmp    L31
L72:
  movq   $0x0,-0x18(%rbp)
  jmp    L83
L28:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  js     L24
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
  jmp    L42
L24:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm0,%xmm0
  cvtsi2sd %rdx,%xmm0
  addsd  %xmm0,%xmm0
L42:
  subsd  -0x40(%rbp),%xmm0
  divsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x8(%rbp),%rcx
  mov    -0x48(%rbp),%rdx
  mov    -0x58(%rbp),%rax
  movq   %rcx,%xmm0
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <sprintf@plt>
  mov    -0x50(%rbp),%rax
  add    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L14
  mov    -0x60(%rbp),%rax
  movl   $0xfffffff5,(%rax)
L14:
  addq   $0x1,-0x18(%rbp)
L83:
  mov    -0x18(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jl     L28
L31:
  jmp    L141
L139:
  mov    -0x10(%rbp),%rax
  movb   $0x2e,(%rax)
L141:
  mov    -0x10(%rbp),%rax
  mov    $0x2c,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L139
  mov    -0x60(%rbp),%rax
  mov    (%rax),%eax
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D5
type: f64

tool: D5: 1

assistant: ```c
int ffu4fstr(unsigned long *input, long ntodo, double scale, double zero, char *cform, long twidth, char *output, int *status) {
  long ii;
  double dvalue;
  char *cptr;
  cptr = output;
  if (scale == 1. && zero == 0.) {
    for (ii = 0; ii < ntodo; ii++) {
      sprintf(output, cform, (double)input[ii]);
      output += twidth;
      if (*output)
        *status = -11;
    }
  } else {
    for (ii = 0; ii < ntodo; ii++) {
      dvalue = (input[ii] - zero) / scale;
      sprintf(output, cform, dvalue);
      output += twidth;
      if (*output)
        *status = -11;
    }
  }
  while ((cptr = strchr(cptr, ',')))
    *cptr = '.';
  return (*status);
}
```