user: Translate the below assembly code into C programming language:

```asm
<send_headers>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdx,%r12
  mov    %rcx,%rbp
  mov    %r8,%rbx
  mov    %r9,0x8(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  mov    %rsi,%rcx
  mov    %edi,%edx
  lea    D2(%rip),%rsi
  lea    D74(%rip),%rdi
  call   <printf@plt>
  lea    D73(%rip),%rsi
  lea    D103(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%edi
  call   <time@plt>
  mov    %rax,0x18(%rsp)
  lea    0x18(%rsp),%rdi
  call   <gmtime@plt>
  mov    %eax,%ecx
  lea    0x20(%rsp),%r13
  lea    D107(%rip),%rdx
  mov    $0x64,%esi
  mov    %r13,%rdi
  call   <strftime@plt>
  mov    %r13,%rsi
  lea    D82(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  test   %r12,%r12
  je     L16
  mov    %r12,%rsi
  lea    D50(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L16:
  test   %rbp,%rbp
  je     L34
  mov    %rbp,%rsi
  lea    D36(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L34:
  test   %rbx,%rbx
  jns    L63
L51:
  cmpq   $0xffffffffffffffff,0x8(%rsp)
  jne    L39
L27:
  lea    D113(%rip),%rdi
  call   <puts@plt>
  lea    D33(%rip),%rdi
  call   <puts@plt>
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L54
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L63:
  mov    %ebx,%esi
  lea    D78(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L51
L39:
  lea    0x8(%rsp),%rdi
  call   <gmtime@plt>
  mov    %eax,%ecx
  lea    0x20(%rsp),%rbx
  lea    D107(%rip),%rdx
  mov    $0x64,%esi
  mov    %rbx,%rdi
  call   <strftime@plt>
  mov    %rbx,%rsi
  lea    D30(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L27
L54:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D2
type_guessed: string
name: disassemble_data
arguments: tag: D74
type_guessed: string
name: disassemble_data
arguments: tag: D73
type_guessed: string
name: disassemble_data
arguments: tag: D103
type_guessed: string
name: disassemble_data
arguments: tag: D107
type_guessed: string
name: disassemble_data
arguments: tag: D82
type_guessed: string
name: disassemble_data
arguments: tag: D50
type_guessed: string
name: disassemble_data
arguments: tag: D36
type_guessed: string
name: disassemble_data
arguments: tag: D113
type_guessed: string
name: disassemble_data
arguments: tag: D33
type_guessed: string
name: disassemble_data
arguments: tag: D78
type_guessed: string
name: disassemble_data
arguments: tag: D30
type_guessed: string

tool: D2: HTTP/1.0

tool: D74: %s %d %s


tool: D73: micro_httpd

tool: D103: Server: %s


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

tool: D82: Date: %s


tool: D50: %s


tool: D36: Content-Type: %s


tool: D113: Connection: close

tool: D33: 

tool: D78: Content-Length: %lld


tool: D30: Last-Modified: %s


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");
}
```