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

```asm
<dec2str>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %rdi,%r13
  mov    %esi,%ebp
  mov    %edx,%r12d
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  pxor   %xmm1,%xmm1
  mov    D169(%rip),%rbx
  comisd %xmm0,%xmm1
  ja     L107
L103:
  movsd  D10(%rip),%xmm1
  call   <fmod@plt>
  movq   %rbx,%xmm3
  mulsd  %xmm0,%xmm3
  movapd %xmm3,%xmm0
  movsd  D6(%rip),%xmm1
  comisd %xmm3,%xmm1
  jb     L70
  addsd  D10(%rip),%xmm0
L70:
  pxor   %xmm1,%xmm1
  mov    $0x2b,%edx
  comisd %xmm0,%xmm1
  ja     L331
L39:
  cvttsd2si %xmm0,%ecx
  pxor   %xmm1,%xmm1
  cvtsi2sd %ecx,%xmm1
  subsd  %xmm1,%xmm0
  movsd  D149(%rip),%xmm1
  mulsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%r8d
  pxor   %xmm2,%xmm2
  cvtsi2sd %r8d,%xmm2
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  cmp    $0x5,%r12d
  jle    L42
  comisd D211(%rip),%xmm0
  jbe    L58
  add    $0x1,%r8d
  pxor   %xmm0,%xmm0
L58:
  cmp    $0x3b,%r8d
  jle    L337
  add    $0x1,%ecx
  mov    $0x0,%r8d
L337:
  movsbl %dl,%edx
  mov    %rsp,%rdi
  lea    D42(%rip),%rsi
  mov    $0x1,%eax
  call   <sprintf@plt>
L183:
  mov    %rsp,%rdi
  call   <strlen@plt>
  mov    %rax,%rcx
  lea    -0x1(%rbp),%edx
  mov    %edx,%eax
  cmp    %rax,%rcx
  jae    L113
  mov    %rsp,%rsi
  mov    %r13,%rdi
  call   <strcpy@plt>
L125:
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L166
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L107:
  xorpd  D36(%rip),%xmm0
  mov    D71(%rip),%rbx
  jmp    L103
L331:
  xorpd  D36(%rip),%xmm0
  mov    $0x2d,%edx
  jmp    L39
L42:
  jne    L153
  comisd D100(%rip),%xmm0
  jbe    L55
  add    $0x1,%r8d
  pxor   %xmm0,%xmm0
L55:
  cmp    $0x3b,%r8d
  jle    L283
  add    $0x1,%ecx
  mov    $0x0,%r8d
L283:
  movsbl %dl,%edx
  mov    %rsp,%rdi
  lea    D216(%rip),%rsi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L183
L153:
  cmp    $0x3,%r12d
  jle    L96
  comisd D120(%rip),%xmm0
  jbe    L251
  add    $0x1,%r8d
  pxor   %xmm0,%xmm0
L251:
  cmp    $0x3b,%r8d
  jle    L124
  add    $0x1,%ecx
  mov    $0x0,%r8d
L124:
  movsbl %dl,%edx
  mov    %rsp,%rdi
  lea    D83(%rip),%rsi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L183
L96:
  jne    L317
  comisd D61(%rip),%xmm0
  jbe    L284
  add    $0x1,%r8d
  pxor   %xmm0,%xmm0
L284:
  cmp    $0x3b,%r8d
  jle    L332
  add    $0x1,%ecx
  mov    $0x0,%r8d
L332:
  movsbl %dl,%edx
  mov    %rsp,%rdi
  lea    D212(%rip),%rsi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L183
L317:
  cmp    $0x1,%r12d
  jle    L76
  comisd D135(%rip),%xmm0
  jbe    L3
  add    $0x1,%r8d
  pxor   %xmm0,%xmm0
L3:
  cmp    $0x3b,%r8d
  jle    L285
  add    $0x1,%ecx
  mov    $0x0,%r8d
L285:
  movsbl %dl,%edx
  mov    %rsp,%rdi
  lea    D45(%rip),%rsi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L183
L76:
  jne    L59
  comisd D152(%rip),%xmm0
  jbe    L13
  add    $0x1,%r8d
  pxor   %xmm0,%xmm0
L13:
  cmp    $0x3b,%r8d
  jle    L232
  add    $0x1,%ecx
  mov    $0x0,%r8d
L232:
  movsbl %dl,%edx
  mov    %rsp,%rdi
  lea    D215(%rip),%rsi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L183
L59:
  test   %r12d,%r12d
  js     L183
  movapd %xmm0,%xmm1
  addsd  D66(%rip),%xmm1
  cvttsd2si %xmm1,%eax
  cmp    $0x3b,%eax
  setg   %al
  movzbl %al,%eax
  add    %eax,%r8d
  cmp    $0x3b,%r8d
  jle    L200
  add    $0x1,%ecx
  mov    $0x0,%r8d
L200:
  movsbl %dl,%edx
  mov    %rsp,%rdi
  lea    D215(%rip),%rsi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L183
L113:
  movslq %edx,%rdx
  mov    %rsp,%rsi
  mov    %r13,%rdi
  call   <strncpy@plt>
  movslq %ebp,%rbp
  movb   $0x0,-0x1(%r13,%rbp,1)
  jmp    L125
L166:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D169
type: f64
name: disassemble_data
arguments: tag: D10
type: f64
name: disassemble_data
arguments: tag: D6
type: f32[2]
name: disassemble_data
arguments: tag: D149
type: f64
name: disassemble_data
arguments: tag: D211
type: f64[2]
name: disassemble_data
arguments: tag: D42
type: string
name: disassemble_data
arguments: tag: D36
type: f32[4]
name: disassemble_data
arguments: tag: D71
type: f32[2]
name: disassemble_data
arguments: tag: D100
type: f64[2]
name: disassemble_data
arguments: tag: D216
type: string
name: disassemble_data
arguments: tag: D120
type: f64[2]
name: disassemble_data
arguments: tag: D83
type: string
name: disassemble_data
arguments: tag: D61
type: f64[2]
name: disassemble_data
arguments: tag: D212
type: string
name: disassemble_data
arguments: tag: D135
type: f64[2]
name: disassemble_data
arguments: tag: D45
type: string
name: disassemble_data
arguments: tag: D152
type: f64[2]
name: disassemble_data
arguments: tag: D215
type: string
name: disassemble_data
arguments: tag: D66
type: f64

tool: D169: 1

tool: D10: 360

tool: {"D6": [0.0,-3.6015625]}

tool: D149: 60

tool: {"D211": [59.999999,59.99999]}

tool: D42: %c%02d:%02d:%09.6f

tool: {"D36": [0.0,-0.0,0.0,0.0]}

tool: {"D71": [0.0,-1.875]}

tool: {"D100": [59.99999,59.9999]}

tool: D216: %c%02d:%02d:%08.5f

tool: {"D120": [59.9999,59.999]}

tool: D83: %c%02d:%02d:%07.4f

tool: {"D61": [59.999,59.99]}

tool: D212: %c%02d:%02d:%06.3f

tool: {"D135": [59.99,59.9]}

tool: D45: %c%02d:%02d:%05.2f

tool: {"D152": [59.9,0.5]}

tool: D215: %c%02d:%02d:%04.1f

tool: D66: 0.5

assistant: ```c
void dec2str(string, lstr, dec, ndec) char *string;
int lstr;
double dec;
int ndec;
{
  double a, b, dsgn, deg1;
  double seconds;
  char sign;
  int degrees;
  int minutes;
  int isec;
  char tstring[64];
  deg1 = dec;
  if (deg1 < 0.0) {
    deg1 = -deg1;
    dsgn = -1.0;
  } else
    dsgn = 1.0;
  deg1 = fmod(deg1, 360.0);
  deg1 *= dsgn;
  if (deg1 <= -180.0)
    deg1 = deg1 + 360.0;
  a = deg1;
  if (a < 0) {
    sign = '-';
    a = -a;
  } else
    sign = '+';
  degrees = (int)a;
  b = (a - (double)degrees) * 60.0;
  minutes = (int)b;
  seconds = (b - (double)minutes) * 60.0;
  isec = (int)(seconds + 0.5);
  if (ndec > 5) {
    if (seconds > 59.999999) {
      seconds = 0.0;
      minutes = minutes + 1;
    }
    if (minutes > 59) {
      minutes = 0;
      degrees = degrees + 1;
    }
    (void)sprintf(tstring, "%c%02d:%02d:%09.6f", sign, degrees, minutes, seconds);
  } else if (ndec > 4) {
    if (seconds > 59.99999) {
      seconds = 0.0;
      minutes = minutes + 1;
    }
    if (minutes > 59) {
      minutes = 0;
      degrees = degrees + 1;
    }
    (void)sprintf(tstring, "%c%02d:%02d:%08.5f", sign, degrees, minutes, seconds);
  } else if (ndec > 3) {
    if (seconds > 59.9999) {
      seconds = 0.0;
      minutes = minutes + 1;
    }
    if (minutes > 59) {
      minutes = 0;
      degrees = degrees + 1;
    }
    (void)sprintf(tstring, "%c%02d:%02d:%07.4f", sign, degrees, minutes, seconds);
  } else if (ndec > 2) {
    if (seconds > 59.999) {
      seconds = 0.0;
      minutes = minutes + 1;
    }
    if (minutes > 59) {
      minutes = 0;
      degrees = degrees + 1;
    }
    (void)sprintf(tstring, "%c%02d:%02d:%06.3f", sign, degrees, minutes, seconds);
  } else if (ndec > 1) {
    if (seconds > 59.99) {
      seconds = 0.0;
      minutes = minutes + 1;
    }
    if (minutes > 59) {
      minutes = 0;
      degrees = degrees + 1;
    }
    (void)sprintf(tstring, "%c%02d:%02d:%05.2f", sign, degrees, minutes, seconds);
  } else if (ndec > 0) {
    if (seconds > 59.9) {
      seconds = 0.0;
      minutes = minutes + 1;
    }
    if (minutes > 59) {
      minutes = 0;
      degrees = degrees + 1;
    }
    (void)sprintf(tstring, "%c%02d:%02d:%04.1f", sign, degrees, minutes, seconds);
  } else if (ndec > -1) {
    if (isec > 59) {
      isec = 0;
      minutes = minutes + 1;
    }
    if (minutes > 59) {
      minutes = 0;
      degrees = degrees + 1;
    }
    (void)sprintf(tstring, "%c%02d:%02d:%04.1f", sign, degrees, minutes, seconds);
  }
  if (strlen(tstring) < (unsigned int)(lstr - 1))
    strcpy(string, tstring);
  else {
    strncpy(string, tstring, lstr - 1);
    string[lstr - 1] = 0;
  }
  return;
}
```