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

```asm
<ftoascii>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  movss  %xmm0,-0x20(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  pxor   %xmm0,%xmm0
  comiss -0x20(%rbp),%xmm0
  jbe    L7
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  lea    D23(%rip),%rdx
  mov    %ecx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <snprintf@plt>
  addq   $0x4,-0x18(%rbp)
  subl   $0x4,-0x1c(%rbp)
  movss  -0x20(%rbp),%xmm0
  movss  D50(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x20(%rbp)
L7:
  movss  -0x20(%rbp),%xmm0
  cvttss2si %xmm0,%eax
  mov    %eax,-0x10(%rbp)
  pxor   %xmm2,%xmm2
  cvtsi2ssl -0x10(%rbp),%xmm2
  movss  -0x20(%rbp),%xmm0
  movaps %xmm0,%xmm1
  subss  %xmm2,%xmm1
  movss  D3(%rip),%xmm0
  mulss  %xmm1,%xmm0
  cvttss2si %xmm0,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,%edi
  call   <ireverse@plt>
  mov    %eax,-0x10(%rbp)
  jmp    L3
L5:
  mov    -0x10(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  lea    0x1e(%rax),%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%rax
  mov    %edx,%ecx
  lea    D6(%rip),%rdx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <snprintf@plt>
  addq   $0x4,-0x18(%rbp)
  subl   $0x4,-0x1c(%rbp)
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x10(%rbp)
L3:
  cmpl   $0x0,-0x10(%rbp)
  je     L4
  cmpl   $0x0,-0x1c(%rbp)
  jg     L5
L4:
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  lea    D36(%rip),%rdx
  mov    %ecx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <snprintf@plt>
  addq   $0x4,-0x18(%rbp)
  subl   $0x4,-0x1c(%rbp)
  mov    -0x8(%rbp),%eax
  lea    0x1e(%rax),%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%rax
  mov    %edx,%ecx
  lea    D6(%rip),%rdx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <snprintf@plt>
  mov    -0xc(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D23
data_type: string
name: extract_symbolic_data
arguments: tag: D50
data_type: byte[4]
name: extract_symbolic_data
arguments: tag: D3
data_type: byte[4]
name: extract_symbolic_data
arguments: tag: D6
data_type: string
name: extract_symbolic_data
arguments: tag: D36
data_type: string

tool: D23: 002D

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

tool: {"D3": [0x00,0x00,0x20,0x41]}

tool: D6: 00%d

tool: D36: 002E

assistant: ```c
int ftoascii(char *str, int len, float value) {
  int integer;
  int frac;
  int tmp;
  int count = len;
  if (value < 0) {
    snprintf(str, len, "002D");
    str += 4;
    len -= 4;
    value = -value;
  }
  integer = (int)value;
  frac = (int)(10 * (value - integer));
  integer = ireverse(integer);
  while (integer && len > 0) {
    tmp = integer % 10;
    snprintf(str, len, "00%d", 30 + tmp);
    str += 4;
    len -= 4;
    integer /= 10;
  }
  snprintf(str, len, "002E");
  str += 4;
  len -= 4;
  snprintf(str, len, "00%d", 30 + frac);
  return count - len;
}
```