user: 请将以下的汇编代码转换成C语言代码：

```asm
<dec2str>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %esi,-0x9c(%rbp)
  movsd  %xmm0,-0xa8(%rbp)
  mov    %edx,-0xa0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movsd  -0xa8(%rbp),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x68(%rbp),%xmm0
  jbe    L8
  movsd  -0x68(%rbp),%xmm0
  movq   D19(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  D124(%rip),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  jmp    L123
L8:
  movsd  D112(%rip),%xmm0
  movsd  %xmm0,-0x70(%rbp)
L123:
  movsd  D219(%rip),%xmm0
  mov    -0x68(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <fmod@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x68(%rbp)
  movsd  -0x68(%rbp),%xmm0
  mulsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  D144(%rip),%xmm0
  comisd -0x68(%rbp),%xmm0
  jb     L1
  movsd  -0x68(%rbp),%xmm1
  movsd  D219(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
L1:
  movsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x78(%rbp),%xmm0
  jbe    L13
  movb   $0x2d,-0x85(%rbp)
  movsd  -0x78(%rbp),%xmm0
  movq   D19(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x78(%rbp)
  jmp    L92
L13:
  movb   $0x2b,-0x85(%rbp)
L92:
  movsd  -0x78(%rbp),%xmm0
  cvttsd2si %xmm0,%eax
  mov    %eax,-0x84(%rbp)
  pxor   %xmm2,%xmm2
  cvtsi2sdl -0x84(%rbp),%xmm2
  movsd  -0x78(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D153(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  -0x58(%rbp),%xmm0
  cvttsd2si %xmm0,%eax
  mov    %eax,-0x80(%rbp)
  pxor   %xmm2,%xmm2
  cvtsi2sdl -0x80(%rbp),%xmm2
  movsd  -0x58(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D153(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  -0x60(%rbp),%xmm1
  movsd  D107(%rip),%xmm0
  addsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%eax
  mov    %eax,-0x7c(%rbp)
  cmpl   $0x5,-0xa0(%rbp)
  jle    L118
  movsd  -0x60(%rbp),%xmm0
  comisd D93(%rip),%xmm0
  jbe    L116
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  addl   $0x1,-0x80(%rbp)
L116:
  cmpl   $0x3b,-0x80(%rbp)
  jle    L276
  movl   $0x0,-0x80(%rbp)
  addl   $0x1,-0x84(%rbp)
L276:
  movsbl -0x85(%rbp),%edx
  mov    -0x60(%rbp),%rsi
  mov    -0x80(%rbp),%edi
  mov    -0x84(%rbp),%ecx
  lea    -0x50(%rbp),%rax
  movq   %rsi,%xmm0
  mov    %edi,%r8d
  lea    D80(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L294
L118:
  cmpl   $0x4,-0xa0(%rbp)
  jle    L23
  movsd  -0x60(%rbp),%xmm0
  comisd D196(%rip),%xmm0
  jbe    L332
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  addl   $0x1,-0x80(%rbp)
L332:
  cmpl   $0x3b,-0x80(%rbp)
  jle    L263
  movl   $0x0,-0x80(%rbp)
  addl   $0x1,-0x84(%rbp)
L263:
  movsbl -0x85(%rbp),%edx
  mov    -0x60(%rbp),%rsi
  mov    -0x80(%rbp),%edi
  mov    -0x84(%rbp),%ecx
  lea    -0x50(%rbp),%rax
  movq   %rsi,%xmm0
  mov    %edi,%r8d
  lea    D179(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L294
L23:
  cmpl   $0x3,-0xa0(%rbp)
  jle    L64
  movsd  -0x60(%rbp),%xmm0
  comisd D55(%rip),%xmm0
  jbe    L233
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  addl   $0x1,-0x80(%rbp)
L233:
  cmpl   $0x3b,-0x80(%rbp)
  jle    L284
  movl   $0x0,-0x80(%rbp)
  addl   $0x1,-0x84(%rbp)
L284:
  movsbl -0x85(%rbp),%edx
  mov    -0x60(%rbp),%rsi
  mov    -0x80(%rbp),%edi
  mov    -0x84(%rbp),%ecx
  lea    -0x50(%rbp),%rax
  movq   %rsi,%xmm0
  mov    %edi,%r8d
  lea    D13(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L294
L64:
  cmpl   $0x2,-0xa0(%rbp)
  jle    L238
  movsd  -0x60(%rbp),%xmm0
  comisd D165(%rip),%xmm0
  jbe    L204
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  addl   $0x1,-0x80(%rbp)
L204:
  cmpl   $0x3b,-0x80(%rbp)
  jle    L288
  movl   $0x0,-0x80(%rbp)
  addl   $0x1,-0x84(%rbp)
L288:
  movsbl -0x85(%rbp),%edx
  mov    -0x60(%rbp),%rsi
  mov    -0x80(%rbp),%edi
  mov    -0x84(%rbp),%ecx
  lea    -0x50(%rbp),%rax
  movq   %rsi,%xmm0
  mov    %edi,%r8d
  lea    D224(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L294
L238:
  cmpl   $0x1,-0xa0(%rbp)
  jle    L248
  movsd  -0x60(%rbp),%xmm0
  comisd D1(%rip),%xmm0
  jbe    L21
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  addl   $0x1,-0x80(%rbp)
L21:
  cmpl   $0x3b,-0x80(%rbp)
  jle    L161
  movl   $0x0,-0x80(%rbp)
  addl   $0x1,-0x84(%rbp)
L161:
  movsbl -0x85(%rbp),%edx
  mov    -0x60(%rbp),%rsi
  mov    -0x80(%rbp),%edi
  mov    -0x84(%rbp),%ecx
  lea    -0x50(%rbp),%rax
  movq   %rsi,%xmm0
  mov    %edi,%r8d
  lea    D9(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L294
L248:
  cmpl   $0x0,-0xa0(%rbp)
  jle    L139
  movsd  -0x60(%rbp),%xmm0
  comisd D66(%rip),%xmm0
  jbe    L132
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  addl   $0x1,-0x80(%rbp)
L132:
  cmpl   $0x3b,-0x80(%rbp)
  jle    L337
  movl   $0x0,-0x80(%rbp)
  addl   $0x1,-0x84(%rbp)
L337:
  movsbl -0x85(%rbp),%edx
  mov    -0x60(%rbp),%rsi
  mov    -0x80(%rbp),%edi
  mov    -0x84(%rbp),%ecx
  lea    -0x50(%rbp),%rax
  movq   %rsi,%xmm0
  mov    %edi,%r8d
  lea    D226(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <sprintf@plt>
  jmp    L294
L139:
  cmpl   $0x0,-0xa0(%rbp)
  js     L294
  cmpl   $0x3b,-0x7c(%rbp)
  jle    L251
  movl   $0x0,-0x7c(%rbp)
  addl   $0x1,-0x80(%rbp)
L251:
  cmpl   $0x3b,-0x80(%rbp)
  jle    L62
  movl   $0x0,-0x80(%rbp)
  addl   $0x1,-0x84(%rbp)
L62:
  movsbl -0x85(%rbp),%edx
  mov    -0x60(%rbp),%rsi
  mov    -0x80(%rbp),%edi
  mov    -0x84(%rbp),%ecx
  lea    -0x50(%rbp),%rax
  movq   %rsi,%xmm0
  mov    %edi,%r8d
  lea    D226(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <sprintf@plt>
L294:
  lea    -0x50(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    -0x9c(%rbp),%edx
  sub    $0x1,%edx
  mov    %edx,%edx
  cmp    %rdx,%rax
  jae    L327
  lea    -0x50(%rbp),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L68
L327:
  mov    -0x9c(%rbp),%eax
  sub    $0x1,%eax
  movslq %eax,%rdx
  lea    -0x50(%rbp),%rcx
  mov    -0x98(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  nop
L68:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L243
  call   <__stack_chk_fail@plt>
L243:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D19
datatype: f32[2]
name: parse_data
arguments: tag: D124
datatype: f32[2]
name: parse_data
arguments: tag: D112
datatype: f64
name: parse_data
arguments: tag: D219
datatype: f64
name: parse_data
arguments: tag: D144
datatype: f32[2]
name: parse_data
arguments: tag: D153
datatype: f64
name: parse_data
arguments: tag: D107
datatype: f64
name: parse_data
arguments: tag: D93
datatype: f64[2]
name: parse_data
arguments: tag: D80
datatype: string
name: parse_data
arguments: tag: D196
datatype: f64[2]
name: parse_data
arguments: tag: D179
datatype: string
name: parse_data
arguments: tag: D55
datatype: f64[2]
name: parse_data
arguments: tag: D13
datatype: string
name: parse_data
arguments: tag: D165
datatype: f64[2]
name: parse_data
arguments: tag: D224
datatype: string
name: parse_data
arguments: tag: D1
datatype: f64[2]
name: parse_data
arguments: tag: D9
datatype: string
name: parse_data
arguments: tag: D66
datatype: f64
name: parse_data
arguments: tag: D226
datatype: string

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

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

tool: D112: 1

tool: D219: 360

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

tool: D153: 60

tool: D107: 0.5

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

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

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

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

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

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

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

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

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

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

tool: D66: 59.9

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

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;
}
```