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

```asm
<por_write_double_to_buffer>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbx
  mov    %rsi,0x10(%rsp)
  movq   %xmm0,%rbp
  mov    %rdx,%r12
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  call   <isnan@plt>
  test   %rax,%rax
  je     L149
  movb   $0x2a,(%rbx)
  movb   $0x2e,0x1(%rbx)
  mov    $0x2,%eax
L196:
  movslq %eax,%rdx
  movb   $0x0,(%rbx,%rdx,1)
L182:
  mov    0x28(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L27
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L149:
  movq   %rbp,%xmm0
  call   <isinf@plt>
  mov    %rax,0x8(%rsp)
  test   %rax,%rax
  je     L257
  pxor   %xmm0,%xmm0
  movq   %rbp,%xmm3
  mov    $0x0,%edx
  comisd %xmm3,%xmm0
  ja     L274
L285:
  movslq %edx,%rax
  movb   $0x31,(%rbx,%rax,1)
  lea    0x1(%rdx),%eax
  cltq
  movb   $0x2b,(%rbx,%rax,1)
  lea    0x2(%rdx),%eax
  cltq
  movb   $0x54,(%rbx,%rax,1)
  lea    0x3(%rdx),%eax
  cltq
  movb   $0x54,(%rbx,%rax,1)
  lea    0x5(%rdx),%eax
  add    $0x4,%edx
  movslq %edx,%rdx
  movb   $0x2f,(%rbx,%rdx,1)
  jmp    L196
L274:
  movb   $0x2d,(%rbx)
  mov    $0x1,%edx
  jmp    L285
L257:
  lea    0x20(%rsp),%rdi
  movq   %rbp,%xmm0
  andpd  D28(%rip),%xmm0
  call   <modf@plt>
  movsd  %xmm0,(%rsp)
  cvttsd2si 0x20(%rsp),%ecx
  pxor   %xmm0,%xmm0
  movq   %rbp,%xmm4
  mov    $0x0,%ebp
  comisd %xmm4,%xmm0
  ja     L102
L192:
  test   %ecx,%ecx
  je     L241
  movsd  (%rsp),%xmm5
  ucomisd D37(%rip),%xmm5
  jp     L133
  jne    L133
  movslq %ecx,%r13
  imul   $0xffffffff88888889,%r13,%r13
  shr    $0x20,%r13
  add    %ecx,%r13d
  sar    $0x4,%r13d
  mov    %ecx,%eax
  sar    $0x1f,%eax
  sub    %eax,%r13d
  imul   $0x1e,%r13d,%eax
  mov    %ecx,%r13d
  sub    %eax,%r13d
  jne    L183
L245:
  movslq %ecx,%rax
  imul   $0xffffffff88888889,%rax,%rax
  shr    $0x20,%rax
  add    %ecx,%eax
  sar    $0x4,%eax
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,%ecx
  add    $0x1,%r13d
  test   %eax,%eax
  je     L143
  movslq %eax,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %eax,%edx
  sar    $0x4,%edx
  mov    %eax,%esi
  sar    $0x1f,%esi
  sub    %esi,%edx
  imul   $0x1e,%edx,%edx
  cmp    %edx,%eax
  je     L245
L143:
  movslq %ebp,%rdi
  mov    0x10(%rsp),%rsi
  sub    %rdi,%rsi
  add    %rbx,%rdi
  mov    %ecx,%edx
  call   <por_write_base30_integer@plt>
  mov    %eax,%r14d
  cltq
  mov    %rax,0x8(%rsp)
  add    %ebp,%r14d
  mov    %r14d,%edx
  movsd  (%rsp),%xmm7
  ucomisd D37(%rip),%xmm7
  jp     L54
  jne    L54
L21:
  mov    %r14d,%edx
  test   %r13d,%r13d
  je     L283
  lea    0x1(%r14),%ebp
  movslq %r14d,%r14
  movb   $0x2b,(%rbx,%r14,1)
  movslq %ebp,%rdi
  mov    0x10(%rsp),%rsi
  sub    %rdi,%rsi
  add    %rbx,%rdi
  mov    %r13d,%edx
  call   <por_write_base30_integer@plt>
  lea    0x0(%rbp,%rax,1),%edx
  jmp    L283
L102:
  movb   $0x2d,(%rbx)
  mov    $0x1,%ebp
  jmp    L192
L183:
  mov    $0x0,%r13d
  jmp    L143
L241:
  lea    0x1(%rbp),%edx
  movslq %ebp,%rax
  movb   $0x30,(%rbx,%rax,1)
  movsd  (%rsp),%xmm6
  ucomisd D37(%rip),%xmm6
  jp     L78
  jne    L78
L283:
  lea    0x1(%rdx),%eax
  movslq %edx,%rbp
  movb   $0x2f,(%rbx,%rbp,1)
  jmp    L196
L133:
  mov    $0x0,%r13d
  jmp    L143
L78:
  mov    %ecx,%r13d
L54:
  lea    0x1(%rdx),%r14d
  movslq %edx,%r15
  movb   $0x2e,(%rbx,%r15,1)
  mov    0x8(%rsp),%rax
  cmp    %r12,%rax
  jge    L21
  mov    %rax,%rbp
  add    $0x2,%edx
  sub    %eax,%edx
  mov    %edx,0x1c(%rsp)
L216:
  movsd  D48(%rip),%xmm0
  mulsd  (%rsp),%xmm0
  lea    0x20(%rsp),%rdi
  call   <modf@plt>
  movsd  %xmm0,(%rsp)
  cvttsd2si 0x20(%rsp),%edi
  test   %edi,%edi
  js     L186
  mov    0x1c(%rsp),%eax
  lea    (%rax,%rbp,1),%r14d
  call   <por_encode_base30_digit@plt>
  mov    %eax,%edx
  mov    %r15,%rax
  sub    0x8(%rsp),%rax
  add    %rbx,%rax
  mov    %dl,0x1(%rbp,%rax,1)
  add    $0x1,%rbp
  movsd  (%rsp),%xmm2
  ucomisd D37(%rip),%xmm2
  setp   %al
  mov    $0x1,%edx
  cmovne %edx,%eax
  test   %al,%al
  je     L21
  cmp    %rbp,%r12
  jg     L216
  jmp    L21
L186:
  mov    $0xffffffff,%eax
  jmp    L182
L27:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D28
data_type: qword[2]
name: disassemble_data
arguments: tag: D37
data_type: f64
name: disassemble_data
arguments: tag: D48
data_type: byte[8]

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

tool: D37: 0

tool: {"D48": [0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x40]}

assistant: ```c
ssize_t por_write_double_to_buffer(char *string, size_t buffer_len, double value, long precision) {
  int offset = 0;
  if (isnan(value)) {
    string[offset++] = '*';
    string[offset++] = '.';
  } else if (isinf(value)) {
    if (value < 0.0) {
      string[offset++] = '-';
    }
    string[offset++] = '1';
    string[offset++] = '+';
    string[offset++] = 'T';
    string[offset++] = 'T';
    string[offset++] = '/';
  } else {
    long integers_printed = 0;
    double integer_part;
    double fraction = modf(fabs(value), &integer_part);
    int64_t integer = integer_part;
    int64_t exponent = 0;
    if (value < 0.0) {
      string[offset++] = '-';
    }
    if (integer == 0) {
      string[offset++] = '0';
    } else {
      while (fraction == 0 && integer != 0 && (integer % 30) == 0) {
        integer /= 30;
        exponent++;
      }
      integers_printed = por_write_base30_integer(&string[offset], buffer_len - offset, integer);
      offset += integers_printed;
    }
    if (fraction) {
      string[offset++] = '.';
    }
    while (fraction && integers_printed < precision) {
      fraction = modf(fraction * 30, &integer_part);
      integer = integer_part;
      if (integer < 0) {
        return -1;
      } else {
        string[offset++] = por_encode_base30_digit(integer);
      }
      integers_printed++;
    }
    if (exponent) {
      string[offset++] = '+';
      offset += por_write_base30_integer(&string[offset], buffer_len - offset, exponent);
    }
    string[offset++] = '/';
  }
  string[offset] = '\0';
  return offset;
}
```