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

```asm
<print_uptime>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  jne    L5
  mov    $0x14,%edi
  call   <malloc@plt>
  mov    %rax,-0x30(%rbp)
L5:
  mov    -0x28(%rbp),%rcx
  movabs $0x8888888888888889,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x5,%rax
  sar    $0x3f,%rcx
  mov    %rcx,%rdx
  sub    %rdx,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rcx
  movabs $0x8888888888888889,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x5,%rax
  sar    $0x3f,%rcx
  mov    %rcx,%rdx
  sub    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rcx
  movabs $0x2aaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rdx,%rax
  sar    $0x2,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x28(%rbp),%rcx
  movabs $0x1845c8a0ce512957,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rdx,%rax
  sar    $0xd,%rax
  sar    $0x3f,%rcx
  mov    %rcx,%rdx
  sub    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  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
  cltq
  mov    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rcx
  movabs $0x8888888888888889,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x5,%rax
  sar    $0x3f,%rcx
  mov    %rcx,%rdx
  sub    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rcx
  movabs $0x2aaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rdx,%rax
  sar    $0x2,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x20(%rbp),%rcx
  movabs $0x8888888888888889,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x5,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x4,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x28(%rbp),%rcx
  movabs $0x8888888888888889,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x5,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x4,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rcx
  mov    -0x10(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  sub    $0x8,%rsp
  push   -0x8(%rbp)
  mov    %rsi,%r9
  mov    %rcx,%r8
  mov    %rdx,%rcx
  lea    D4(%rip),%rdx
  mov    $0x14,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  add    $0x10,%rsp
  mov    -0x30(%rbp),%rax
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D4
data_type: string

tool: D4: Up %ldd, %02ld:%02ld:%02ld

assistant: ```c
char *print_uptime(long up_secs, char *retval) {
  long days, hours, mins, secs;
  if (retval == NULL) {
    retval = malloc(20 * sizeof(char));
  }
  mins = up_secs / 60;
  hours = mins / 60;
  hours = hours % 24;
  days = up_secs / (60 * 60 * 24);
  mins = (int)up_secs / 60;
  hours = mins / 60;
  hours = hours % 24;
  mins = mins % 60;
  secs = up_secs % 60;
  snprintf(retval, 20, "Up %ldd, %02ld:%02ld:%02ld", days, hours, mins, secs);
  return retval;
}
```