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

```asm
<pr_time>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x10,%rsp
  movq   %xmm0,%rbx
  lea    D185(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %eax,%ebp
  test   %eax,%eax
  setg   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movq   %rbx,%xmm5
  comisd D238(%rip),%xmm5
  jae    L40
  comisd D238(%rip),%xmm5
  jae    L0
  comisd D34(%rip),%xmm5
  jb     L4
  movq   %rbx,%xmm0
  divsd  D34(%rip),%xmm0
  movapd %xmm0,%xmm2
  movsd  D86(%rip),%xmm3
  movapd %xmm0,%xmm1
  andpd  %xmm3,%xmm1
  movsd  D193(%rip),%xmm4
  ucomisd %xmm1,%xmm4
  jbe    L85
  cvttsd2si %xmm0,%rax
  pxor   %xmm1,%xmm1
  cvtsi2sd %rax,%xmm1
  movapd %xmm1,%xmm2
  cmpnlesd %xmm0,%xmm2
  movsd  D74(%rip),%xmm4
  andpd  %xmm4,%xmm2
  subsd  %xmm2,%xmm1
  andnpd %xmm0,%xmm3
  movapd %xmm1,%xmm2
  orpd   %xmm3,%xmm2
L85:
  movsd  %xmm2,0x8(%rsp)
  movq   %rbx,%xmm6
  comisd D238(%rip),%xmm6
  jae    L29
  cvttsd2si %xmm2,%esi
  lea    D112(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %eax,%r12d
  jmp    L51
L40:
  movq   %rbx,%xmm1
  divsd  D238(%rip),%xmm1
  movsd  %xmm1,0x8(%rsp)
  movsd  D86(%rip),%xmm2
  movapd %xmm1,%xmm0
  andpd  %xmm2,%xmm0
  movsd  D193(%rip),%xmm3
  ucomisd %xmm0,%xmm3
  jbe    L21
  cvttsd2si %xmm1,%rax
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
  movapd %xmm0,%xmm3
  cmpnlesd %xmm1,%xmm3
  movsd  D74(%rip),%xmm4
  andpd  %xmm4,%xmm3
  subsd  %xmm3,%xmm0
  andnpd %xmm1,%xmm2
  orpd   %xmm2,%xmm0
  movsd  %xmm0,0x8(%rsp)
L21:
  cvttsd2si 0x8(%rsp),%esi
  lea    D112(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  setg   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  add    %r12d,%ebp
  movsd  0x8(%rsp),%xmm0
  mulsd  D238(%rip),%xmm0
  movq   %rbx,%xmm7
  subsd  %xmm0,%xmm7
  movq   %xmm7,%rbx
L0:
  movq   %rbx,%xmm0
  divsd  D34(%rip),%xmm0
  movapd %xmm0,%xmm3
  movsd  D86(%rip),%xmm2
  movapd %xmm0,%xmm1
  andpd  %xmm2,%xmm1
  movsd  D193(%rip),%xmm4
  ucomisd %xmm1,%xmm4
  jbe    L53
  cvttsd2si %xmm0,%rax
  pxor   %xmm1,%xmm1
  cvtsi2sd %rax,%xmm1
  movapd %xmm1,%xmm3
  cmpnlesd %xmm0,%xmm3
  movsd  D74(%rip),%xmm4
  andpd  %xmm4,%xmm3
  subsd  %xmm3,%xmm1
  andnpd %xmm0,%xmm2
  movapd %xmm1,%xmm3
  orpd   %xmm2,%xmm3
L53:
  movsd  %xmm3,0x8(%rsp)
L29:
  cvttsd2si 0x8(%rsp),%esi
  lea    D230(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %eax,%r12d
L51:
  test   %r12d,%r12d
  setg   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  add    %r12d,%ebp
  movsd  0x8(%rsp),%xmm0
  mulsd  D34(%rip),%xmm0
  movq   %rbx,%xmm1
  subsd  %xmm0,%xmm1
  movapd %xmm1,%xmm0
  call   <round@plt>
  mov    %eax,%esi
  lea    D95(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %eax,%ebx
L28:
  test   %ebx,%ebx
  setg   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  lea    (%rbx,%rbp,1),%eax
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L4:
  movq   %rbx,%xmm0
  call   <round@plt>
  mov    %eax,%esi
  lea    D82(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %eax,%ebx
  jmp    L28
```

tool_calls: name: parse_data
arguments: label: D185
data_type: string
name: parse_data
arguments: label: D238
data_type: f64[2]
name: parse_data
arguments: label: D34
data_type: f64[2]
name: parse_data
arguments: label: D86
data_type: byte[8]
name: parse_data
arguments: label: D193
data_type: byte[8]
name: parse_data
arguments: label: D74
data_type: byte[8]
name: parse_data
arguments: label: D112
data_type: string
name: parse_data
arguments: label: D230
data_type: string
name: parse_data
arguments: label: D95
data_type: string
name: parse_data
arguments: label: D82
data_type: string

tool: D185:  -- 

tool: {"D238": [3600.0,4503599627370496.0]}

tool: {"D34": [60.0,0.0]}

tool: {"D86": [0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f]}

tool: {"D193": [0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x43]}

tool: {"D74": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: D112: %i:

tool: D230: %02i:

tool: D95: %02i

tool: D82: %is

assistant: ```c
int pr_time(double sec) {
  int has_h, has_m;
  int c, tot;
  tot = printf(" -- ");
  assert(tot > 0);
  has_h = sec >= 3600;
  if (has_h) {
    double h = floor(sec / 3600);
    c = printf("%i:", (int)h);
    assert(c > 0);
    tot += c;
    sec -= h * 3600;
  }
  has_m = has_h || sec >= 60;
  if (has_m) {
    double m = floor(sec / 60);
    if (has_h)
      c = printf("%02i:", (int)m);
    else
      c = printf("%i:", (int)m);
    assert(c > 0);
    tot += c;
    sec -= m * 60;
  }
  if (has_m)
    c = printf("%02i", (int)round(sec));
  else
    c = printf("%is", (int)round(sec));
  assert(c > 0);
  return tot + c;
}
```