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

```asm
<time_diff>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    -0x1c(%rbp),%r9d
  mov    -0x20(%rbp),%r8d
  mov    -0x24(%rbp),%ecx
  mov    -0x28(%rbp),%edx
  mov    -0x2c(%rbp),%esi
  mov    -0x78(%rbp),%rax
  mov    -0x14(%rbp),%edi
  push   %rdi
  mov    -0x18(%rbp),%edi
  push   %rdi
  mov    %rax,%rdi
  call   <date_format@plt>
  add    $0x10,%rsp
  mov    -0x40(%rbp),%r9d
  mov    -0x48(%rbp),%r8d
  mov    -0x4c(%rbp),%ecx
  mov    -0x50(%rbp),%edx
  mov    -0x54(%rbp),%esi
  mov    -0x70(%rbp),%rax
  mov    -0x10(%rbp),%edi
  push   %rdi
  mov    -0x38(%rbp),%edi
  push   %rdi
  mov    %rax,%rdi
  call   <date_format@plt>
  add    $0x10,%rsp
  mov    -0x10(%rbp),%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  cmpl   $0x0,-0x30(%rbp)
  jns    L17
  addl   $0x3e8,-0x30(%rbp)
  subl   $0x1,-0x38(%rbp)
L17:
  mov    -0x38(%rbp),%eax
  sub    -0x18(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  jns    L58
  addl   $0x3c,-0x34(%rbp)
  subl   $0x1,-0x40(%rbp)
L58:
  mov    -0x40(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  mov    %eax,-0x3c(%rbp)
  cmpl   $0x0,-0x3c(%rbp)
  jns    L32
  addl   $0x3c,-0x3c(%rbp)
  subl   $0x1,-0x48(%rbp)
L32:
  mov    -0x48(%rbp),%eax
  sub    -0x20(%rbp),%eax
  mov    %eax,-0x44(%rbp)
  cmpl   $0x0,-0x44(%rbp)
  jns    L24
  addl   $0x18,-0x44(%rbp)
  subl   $0x1,-0x4c(%rbp)
L24:
  mov    -0x4c(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x0,-0xc(%rbp)
  jns    L47
  addl   $0x1e,-0xc(%rbp)
  subl   $0x1,-0x50(%rbp)
L47:
  mov    -0x50(%rbp),%eax
  sub    -0x28(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  cmpl   $0x0,-0x8(%rbp)
  jns    L10
  addl   $0xc,-0x8(%rbp)
  subl   $0x1,-0x54(%rbp)
L10:
  mov    -0x54(%rbp),%eax
  sub    -0x2c(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x30(%rbp),%edi
  mov    -0x34(%rbp),%esi
  mov    -0x3c(%rbp),%ecx
  mov    -0x44(%rbp),%edx
  mov    -0x68(%rbp),%rax
  mov    %edi,%r9d
  mov    %esi,%r8d
  lea    D3(%rip),%rsi
  mov    %rax,%rdi
  call   <sprintf@plt>
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D3
type_infered: string

tool: D3: %02d:%02d:%02d.%03d

assistant: ```c
void time_diff(char *time_result, char *date_final, char *date_initial) {
  int year1, year2, year_result;
  int month1, month2, month_result;
  int day1, day2, day_result;
  int hour1, hour2, hour_result;
  int minute1, minute2, minute_result;
  int second1, second2, second_result;
  int milisecond1, milisecond2, milisecond_result;
  date_format(date_initial, year1, month1, day1, hour1, minute1, second1, milisecond1);
  date_format(date_final, year2, month2, day2, hour2, minute2, second2, milisecond2);
  milisecond_result = milisecond2 - milisecond1;
  if (milisecond_result < 0) {
    milisecond_result += 1000;
    second2--;
  }
  second_result = second2 - second1;
  if (second_result < 0) {
    second_result += 60;
    minute2--;
  }
  minute_result = minute2 - minute1;
  if (minute_result < 0) {
    minute_result += 60;
    hour2--;
  }
  hour_result = hour2 - hour1;
  if (hour_result < 0) {
    hour_result += 24;
    day2--;
  }
  day_result = day2 - day1;
  if (day_result < 0) {
    day_result += 30;
    month2--;
  }
  month_result = month2 - month1;
  if (month_result < 0) {
    month_result += 12;
    year2--;
  }
  year_result = year2 - year1;
  sprintf(time_result, "%02d:%02d:%02d.%03d", hour_result, minute_result, second_result, milisecond_result);
}
```