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

```asm
<send_headers>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %edi,-0x84(%rbp)
  mov    %rsi,-0x90(%rbp)
  mov    %rdx,-0x98(%rbp)
  mov    %rcx,-0xa0(%rbp)
  mov    %r8,-0xa8(%rbp)
  mov    %r9,-0xb0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x90(%rbp),%rdx
  mov    -0x84(%rbp),%eax
  mov    %rdx,%rcx
  mov    %eax,%edx
  lea    D25(%rip),%rax
  mov    %rax,%rsi
  lea    D103(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D50(%rip),%rax
  mov    %rax,%rsi
  lea    D119(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%edi
  call   <time@plt>
  mov    %rax,-0x78(%rbp)
  lea    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <gmtime@plt>
  mov    %eax,%edx
  lea    -0x70(%rbp),%rax
  mov    %edx,%ecx
  lea    D29(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <strftime@plt>
  lea    -0x70(%rbp),%rax
  mov    %rax,%rsi
  lea    D26(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  cmpq   $0x0,-0x98(%rbp)
  je     L16
  mov    -0x98(%rbp),%rax
  mov    %rax,%rsi
  lea    D71(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L16:
  cmpq   $0x0,-0xa0(%rbp)
  je     L26
  mov    -0xa0(%rbp),%rax
  mov    %rax,%rsi
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L26:
  cmpq   $0x0,-0xa8(%rbp)
  js     L48
  mov    -0xa8(%rbp),%rax
  mov    %eax,%esi
  lea    D70(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L48:
  mov    -0xb0(%rbp),%rax
  cmp    $0xffffffffffffffff,%rax
  je     L21
  lea    -0xb0(%rbp),%rax
  mov    %rax,%rdi
  call   <gmtime@plt>
  mov    %eax,%edx
  lea    -0x70(%rbp),%rax
  mov    %edx,%ecx
  lea    D29(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <strftime@plt>
  lea    -0x70(%rbp),%rax
  mov    %rax,%rsi
  lea    D1(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L21:
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D56(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L25
  call   <__stack_chk_fail@plt>
L25:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D25
type: string
name: disassemble_data
arguments: data_label: D103
type: string
name: disassemble_data
arguments: data_label: D50
type: string
name: disassemble_data
arguments: data_label: D119
type: string
name: disassemble_data
arguments: data_label: D29
type: string
name: disassemble_data
arguments: data_label: D26
type: string
name: disassemble_data
arguments: data_label: D71
type: string
name: disassemble_data
arguments: data_label: D64
type: string
name: disassemble_data
arguments: data_label: D70
type: string
name: disassemble_data
arguments: data_label: D1
type: string
name: disassemble_data
arguments: data_label: D66
type: string
name: disassemble_data
arguments: data_label: D56
type: string

tool: D25: HTTP/1.0

tool: D103: %s %d %s


tool: D50: micro_httpd

tool: D119: Server: %s


tool: D29: %a, %d %b %Y %H:%M:%S GMT

tool: D26: Date: %s


tool: D71: %s


tool: D64: Content-Type: %s


tool: D70: Content-Length: %lld


tool: D1: Last-Modified: %s


tool: D66: Connection: close

tool: D56: 

assistant: ```c
void send_headers(int status, char *title, char *extra_header, char *mime_type, off_t length, time_t mod) {
  time_t now;
  char timebuf[100];
  (void)printf("%s %d %s\015\012", "HTTP/1.0", status, title);
  (void)printf("Server: %s\015\012", "micro_httpd");
  now = time((time_t *)0);
  (void)strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now));
  (void)printf("Date: %s\015\012", timebuf);
  if (extra_header != (char *)0)
    (void)printf("%s\015\012", extra_header);
  if (mime_type != (char *)0)
    (void)printf("Content-Type: %s\015\012", mime_type);
  if (length >= 0)
    (void)printf("Content-Length: %lld\015\012", (int64_t)length);
  if (mod != (time_t)-1) {
    (void)strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", gmtime(&mod));
    (void)printf("Last-Modified: %s\015\012", timebuf);
  }
  (void)printf("Connection: close\015\012");
  (void)printf("\015\012");
}
```