user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<seconds2string>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xd0,%rsp
  mov    %rdi,-0xc8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x1,-0xa8(%rbp)
  mov    -0xa8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x4,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xa0(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x4,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x98(%rbp),%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,-0x90(%rbp)
  mov    -0x90(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  sub    %rdx,%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x90(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  mov    %rax,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x88(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x90(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0xa8(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  movl   $0x72616579,-0x70(%rbp)
  movw   $0x0,-0x6c(%rbp)
  movb   $0x0,-0x6a(%rbp)
  movl   $0x6b656577,-0x69(%rbp)
  movw   $0x0,-0x65(%rbp)
  movb   $0x0,-0x63(%rbp)
  movl   $0x796164,-0x62(%rbp)
  movw   $0x0,-0x5e(%rbp)
  movb   $0x0,-0x5c(%rbp)
  movl   $0x72756f68,-0x5b(%rbp)
  movw   $0x0,-0x57(%rbp)
  movb   $0x0,-0x55(%rbp)
  movl   $0x756e696d,-0x54(%rbp)
  movw   $0x6574,-0x50(%rbp)
  movb   $0x0,-0x4e(%rbp)
  movl   $0x6f636573,-0x4d(%rbp)
  movw   $0x646e,-0x49(%rbp)
  movb   $0x0,-0x47(%rbp)
  lea    D64(%rip),%rax
  mov    %rax,-0xb0(%rbp)
  movl   $0x0,-0xb4(%rbp)
  jmp    L39
L75:
  mov    -0xb4(%rbp),%eax
  cltq
  mov    -0x40(%rbp,%rax,8),%rdi
  mov    -0xc8(%rbp),%rax
  mov    $0x0,%edx
  div    %rdi
  mov    %rax,-0x78(%rbp)
  mov    -0xb4(%rbp),%eax
  cltq
  mov    -0x40(%rbp,%rax,8),%rcx
  mov    -0xc8(%rbp),%rax
  mov    $0x0,%edx
  div    %rcx
  mov    %rdx,-0xc8(%rbp)
  cmpq   $0x0,-0x78(%rbp)
  je     L18
  lea    D64(%rip),%rax
  cmp    %rax,-0xb0(%rbp)
  je     L49
  mov    -0xb0(%rbp),%rax
  lea    D33(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  cltq
  add    %rax,-0xb0(%rbp)
L49:
  cmpq   $0x1,-0x78(%rbp)
  jbe    L29
  lea    D70(%rip),%rdx
  jmp    L61
L29:
  lea    D41(%rip),%rdx
L61:
  lea    -0x70(%rbp),%rsi
  mov    -0xb4(%rbp),%eax
  movslq %eax,%rcx
  mov    %rcx,%rax
  shl    $0x3,%rax
  sub    %rcx,%rax
  lea    (%rsi,%rax,1),%rcx
  mov    -0x78(%rbp),%rsi
  mov    -0xb0(%rbp),%rax
  mov    %rdx,%r8
  mov    %rsi,%rdx
  lea    D72(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  cltq
  add    %rax,-0xb0(%rbp)
L18:
  addl   $0x1,-0xb4(%rbp)
L39:
  cmpl   $0x5,-0xb4(%rbp)
  jle    L75
  lea    D64(%rip),%rax
  cmp    %rax,-0xb0(%rbp)
  jne    L16
  mov    -0xb0(%rbp),%rax
  lea    D13(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
L16:
  lea    D64(%rip),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L62
  call   <__stack_chk_fail@plt>
L62:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D33
type_guessed: string
name: retrieve_data
arguments: label: D70
type_guessed: string
name: retrieve_data
arguments: label: D41
type_guessed: string
name: retrieve_data
arguments: label: D72
type_guessed: string
name: retrieve_data
arguments: label: D13
type_guessed: string

tool: D33: , 

tool: D70: s

tool: 

tool: D72: %lu %s%s

tool: D13: ...

assistant: ```c
char *seconds2string(unsigned long seconds) {
  int i;
  const unsigned long s = 1;
  const unsigned long m = 60 * s;
  const unsigned long h = 60 * m;
  const unsigned long d = 24 * h;
  const unsigned long w = 7 * d;
  const unsigned long y = 365 * d;
  const unsigned long coeff[6] = {y, w, d, h, m, s};
  const char units[6][7] = {"year", "week", "day", "hour", "minute", "second"};
  static char buffer[256];
  char *ptr = buffer;
  for (i = 0; i < 6; i++) {
    unsigned long value;
    value = seconds / coeff[i];
    seconds = seconds % coeff[i];
    if (value) {
      if (ptr != buffer)
        ptr += sprintf(ptr, ", ");
      ptr += sprintf(ptr, "%lu %s%s", value, units[i], (value > 1 ? "s" : ""));
    }
  }
  if (ptr == buffer)
    sprintf(ptr, "...");
  return buffer;
}
```