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

```asm
<main>:
  endbr64
  push   %r14
  xor    %eax,%eax
  push   %r13
  push   %r12
  push   %rbp
  sub    $0x48,%rsp
  call   <display_initial_message@plt>
  mov    $0x1,%edi
  call   <read_minutes@plt>
  mov    $0x2,%edi
  mov    %eax,%r14d
  call   <read_minutes@plt>
  mov    $0x3,%edi
  mov    %eax,%r13d
  call   <read_minutes@plt>
  mov    $0x4,%edi
  mov    %eax,%r12d
  call   <read_minutes@plt>
  lea    D0(%rip),%rdi
  mov    %eax,%ebp
  call   <printf@plt>
  mov    $0x1,%edi
  call   <read_seconds@plt>
  mov    $0x2,%edi
  movsd  %xmm0,0x18(%rsp)
  call   <read_seconds@plt>
  mov    $0x3,%edi
  movsd  %xmm0,0x10(%rsp)
  call   <read_seconds@plt>
  mov    $0x4,%edi
  movsd  %xmm0,0x8(%rsp)
  call   <read_seconds@plt>
  movsd  0x18(%rsp),%xmm1
  mov    %r14d,%edi
  movsd  %xmm0,(%rsp)
  movapd %xmm1,%xmm0
  call   <convert_time_to_seconds@plt>
  movsd  0x10(%rsp),%xmm4
  mov    %r13d,%edi
  movsd  %xmm0,0x18(%rsp)
  movapd %xmm4,%xmm0
  call   <convert_time_to_seconds@plt>
  movsd  0x8(%rsp),%xmm3
  mov    %r12d,%edi
  movsd  %xmm0,0x10(%rsp)
  movapd %xmm3,%xmm0
  call   <convert_time_to_seconds@plt>
  movsd  (%rsp),%xmm2
  mov    %ebp,%edi
  lea    D3(%rip),%rbp
  movsd  %xmm0,0x8(%rsp)
  movapd %xmm2,%xmm0
  call   <convert_time_to_seconds@plt>
  movsd  0x18(%rsp),%xmm1
  movsd  %xmm0,(%rsp)
  movapd %xmm1,%xmm0
  call   <calculate_feet_per_second@plt>
  movsd  0x10(%rsp),%xmm4
  movsd  %xmm0,0x38(%rsp)
  movapd %xmm4,%xmm0
  call   <calculate_feet_per_second@plt>
  movsd  0x8(%rsp),%xmm3
  movsd  %xmm0,0x30(%rsp)
  movapd %xmm3,%xmm0
  call   <calculate_feet_per_second@plt>
  movsd  (%rsp),%xmm2
  movsd  %xmm0,0x28(%rsp)
  movapd %xmm2,%xmm0
  call   <calculate_feet_per_second@plt>
  movsd  0x18(%rsp),%xmm1
  movsd  %xmm0,0x20(%rsp)
  movapd %xmm1,%xmm0
  call   <calculate_meters_per_second@plt>
  movsd  0x10(%rsp),%xmm4
  movsd  %xmm0,0x18(%rsp)
  movapd %xmm4,%xmm0
  call   <calculate_meters_per_second@plt>
  movsd  0x8(%rsp),%xmm3
  movsd  %xmm0,0x10(%rsp)
  movapd %xmm3,%xmm0
  call   <calculate_meters_per_second@plt>
  movsd  (%rsp),%xmm2
  movsd  %xmm0,0x8(%rsp)
  movapd %xmm2,%xmm0
  call   <calculate_meters_per_second@plt>
  lea    D16(%rip),%rdi
  movsd  %xmm0,(%rsp)
  call   <printf@plt>
  lea    D26(%rip),%rdi
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <printf@plt>
  movsd  0x18(%rsp),%xmm1
  mov    $0x1,%edi
  movsd  0x38(%rsp),%xmm8
  movapd %xmm8,%xmm0
  call   <display_speeds@plt>
  movsd  0x10(%rsp),%xmm4
  movsd  0x30(%rsp),%xmm7
  mov    $0x2,%edi
  movapd %xmm4,%xmm1
  movapd %xmm7,%xmm0
  call   <display_speeds@plt>
  movsd  0x8(%rsp),%xmm3
  movsd  0x28(%rsp),%xmm6
  mov    $0x3,%edi
  movapd %xmm3,%xmm1
  movapd %xmm6,%xmm0
  call   <display_speeds@plt>
  movsd  (%rsp),%xmm2
  movsd  0x20(%rsp),%xmm5
  mov    $0x4,%edi
  movapd %xmm2,%xmm1
  movapd %xmm5,%xmm0
  call   <display_speeds@plt>
  mov    %rbp,%rdi
  call   <printf@plt>
  xor    %eax,%eax
  add    $0x48,%rsp
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D0
type_guessed: string
name: extract_symbolic_data
arguments: tag: D3
type_guessed: string
name: extract_symbolic_data
arguments: tag: D16
type_guessed: string
name: extract_symbolic_data
arguments: tag: D26
type_guessed: string

tool: D0: 


tool: D3: ********************


tool: D16: 
********************


tool: D26: Runner	FPS	MPS


assistant: ```c
int main(void) {
  int runner1_min = 0, runner2_min = 0, runner3_min = 0, runner4_min = 0;
  double runner1_sec = 0.0, runner2_sec = 0.0, runner3_sec = 0.0, runner4_sec = 0.0;
  double runner1_time_sec = 0.0, runner2_time_sec = 0.0, runner3_time_sec = 0.0, runner4_time_sec = 0.0;
  double runner1_fps = 0.0, runner2_fps = 0.0, runner3_fps = 0.0, runner4_fps = 0.0;
  double runner1_mps = 0.0, runner2_mps = 0.0, runner3_mps = 0.0, runner4_mps = 0.0;
  display_initial_message();
  runner1_min = read_minutes(1);
  runner2_min = read_minutes(2);
  runner3_min = read_minutes(3);
  runner4_min = read_minutes(4);
  printf("\n");
  runner1_sec = read_seconds(1);
  runner2_sec = read_seconds(2);
  runner3_sec = read_seconds(3);
  runner4_sec = read_seconds(4);
  runner1_time_sec = convert_time_to_seconds(runner1_min, runner1_sec);
  runner2_time_sec = convert_time_to_seconds(runner2_min, runner2_sec);
  runner3_time_sec = convert_time_to_seconds(runner3_min, runner3_sec);
  runner4_time_sec = convert_time_to_seconds(runner4_min, runner4_sec);
  runner1_fps = calculate_feet_per_second(runner1_time_sec);
  runner2_fps = calculate_feet_per_second(runner2_time_sec);
  runner3_fps = calculate_feet_per_second(runner3_time_sec);
  runner4_fps = calculate_feet_per_second(runner4_time_sec);
  runner1_mps = calculate_meters_per_second(runner1_time_sec);
  runner2_mps = calculate_meters_per_second(runner2_time_sec);
  runner3_mps = calculate_meters_per_second(runner3_time_sec);
  runner4_mps = calculate_meters_per_second(runner4_time_sec);
  printf("\n********************\n");
  printf("Runner\tFPS\tMPS\n");
  printf("********************\n");
  display_speeds(runner1_fps, runner1_mps, 1);
  display_speeds(runner2_fps, runner2_mps, 2);
  display_speeds(runner3_fps, runner3_mps, 3);
  display_speeds(runner4_fps, runner4_mps, 4);
  printf("********************\n");
  return (0);
}
```