user: 这段汇编代码用C语言表示是什么样的?

```asm
<get_eta>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %edx,-0x2c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x10(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  jne    L94
  lea    -0x10(%rbp),%rax
  lea    D1(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <asprintf@plt>
  cmp    $0xffffffff,%eax
  jne    L22
  mov    $0x0,%eax
  jmp    L119
L22:
  mov    -0x10(%rbp),%rax
  jmp    L119
L94:
  mov    -0x28(%rbp),%eax
  sub    -0x24(%rbp),%eax
  cltd
  idivl  -0x2c(%rbp)
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %eax,%edx
  sar    $0x5,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %eax,%edx
  sar    $0x5,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x2aaaaaab,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%edx
  movslq %edx,%rax
  imul   $0x2aaaaaab,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  add    %eax,%eax
  add    %ecx,%eax
  shl    $0x3,%eax
  sub    %eax,%edx
  mov    %edx,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %eax,%edx
  sar    $0x5,%edx
  mov    %eax,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%edx
  imul   $0x3c,%edx,%edx
  sub    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %eax,%edx
  sar    $0x5,%edx
  mov    %eax,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%edx
  imul   $0x3c,%edx,%edx
  sub    %edx,%eax
  mov    %eax,-0x20(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  je     L70
  mov    -0x18(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  lea    -0x10(%rbp),%rax
  lea    D4(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <asprintf@plt>
  cmp    $0xffffffff,%eax
  jne    L113
  mov    $0x0,%eax
  jmp    L119
L70:
  cmpl   $0x0,-0x18(%rbp)
  je     L105
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  lea    -0x10(%rbp),%rax
  lea    D19(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <asprintf@plt>
  cmp    $0xffffffff,%eax
  jne    L113
  mov    $0x0,%eax
  jmp    L119
L105:
  mov    -0x20(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  lea    -0x10(%rbp),%rax
  lea    D39(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <asprintf@plt>
  cmp    $0xffffffff,%eax
  jne    L113
  mov    $0x0,%eax
  jmp    L119
L113:
  mov    -0x10(%rbp),%rax
L119:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L76
  call   <__stack_chk_fail@plt>
L76:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_tag: D1
type_infered: string
name: retrieve_data
arguments: data_tag: D4
type_infered: string
name: retrieve_data
arguments: data_tag: D19
type_infered: string
name: retrieve_data
arguments: data_tag: D39
type_infered: string

tool: D1: ??? ETA

tool: D4: %llud%lluh ETA

tool: D19: %lluh%llum ETA

tool: D39: %llum%llus ETA

assistant: ```c
char *get_eta(uint64_t done, uint64_t total, uint32_t byterate) {
  char *str = NULL;
  if (byterate == 0) {
    if (asprintf(&str, "??? ETA") == -1)
      return NULL;
    return str;
  }
  uint64_t seconds = (total - done) / byterate;
  uint64_t minutes = seconds / 60;
  uint64_t hours = minutes / 60;
  uint64_t days = hours / 24;
  hours %= 24;
  minutes %= 60;
  seconds %= 60;
  if (days) {
    if (asprintf(&str, "%llud%lluh ETA", (long long unsigned int)days, (long long unsigned int)hours) == -1)
      return NULL;
  } else if (hours) {
    if (asprintf(&str, "%lluh%llum ETA", (long long unsigned int)hours, (long long unsigned int)minutes) == -1)
      return NULL;
  } else {
    if (asprintf(&str, "%llum%llus ETA", (long long unsigned int)minutes, (long long unsigned int)seconds) == -1)
      return NULL;
  }
  return (str);
}
```