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

```asm
<serveBMP>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,-0x54(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D11(%rip),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,%rsi
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x40(%rbp),%rcx
  mov    -0x54(%rbp),%eax
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <write@plt>
  mov    -0x54(%rbp),%eax
  mov    %eax,%edi
  call   <writeHeader@plt>
  movsd  D21(%rip),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  D134(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  D133(%rip),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D38(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x28(%rbp),%xmm1
  movsd  -0x38(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  D38(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x28(%rbp),%xmm1
  movsd  -0x30(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  jmp    L34
L22:
  movsd  -0x48(%rbp),%xmm0
  mov    -0x50(%rbp),%rsi
  lea    -0x20(%rbp),%rcx
  mov    -0x54(%rbp),%eax
  mov    $0x0,%edx
  movapd %xmm0,%xmm1
  movq   %rsi,%xmm0
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <calcPoint@plt>
  movsd  D38(%rip),%xmm0
  divsd  -0x28(%rbp),%xmm0
  movsd  D2(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movsd  -0x50(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
L25:
  movsd  D38(%rip),%xmm0
  movapd %xmm0,%xmm2
  divsd  -0x28(%rbp),%xmm2
  movsd  -0x38(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D38(%rip),%xmm0
  divsd  -0x28(%rbp),%xmm0
  movsd  D2(%rip),%xmm3
  movapd %xmm0,%xmm2
  divsd  %xmm3,%xmm2
  movsd  D154(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  comisd -0x50(%rbp),%xmm0
  ja     L22
  movsd  D38(%rip),%xmm0
  divsd  -0x28(%rbp),%xmm0
  movsd  D2(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movsd  -0x48(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  D38(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x28(%rbp),%xmm1
  movsd  -0x38(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,-0x18(%rbp)
L34:
  movsd  D38(%rip),%xmm0
  movapd %xmm0,%xmm2
  divsd  -0x28(%rbp),%xmm2
  movsd  -0x30(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D38(%rip),%xmm0
  divsd  -0x28(%rbp),%xmm0
  movsd  D2(%rip),%xmm3
  movapd %xmm0,%xmm2
  divsd  %xmm3,%xmm2
  movsd  D154(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  comisd -0x48(%rbp),%xmm0
  ja     L25
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L2
  call   <__stack_chk_fail@plt>
L2:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D11
datatype: string
name: disassemble_data
arguments: data_label: D4
datatype: string
name: disassemble_data
arguments: data_label: D21
datatype: f64
name: disassemble_data
arguments: data_label: D134
datatype: f64
name: disassemble_data
arguments: data_label: D133
datatype: f64
name: disassemble_data
arguments: data_label: D38
datatype: f64
name: disassemble_data
arguments: data_label: D2
datatype: f64
name: disassemble_data
arguments: data_label: D154
datatype: byte[8]

tool: D11: HTTP/1.0 200 OK
Content-Type: image/bmp



tool: D4: about to send=> %s


tool: D21: 0.14

tool: D134: 0.61

tool: D133: 60

tool: D38: 2

tool: D2: 256

tool: {"D154": [0x00,0x00,0x00,0x00,0x00,0xf0,0x7f,0x40]}

assistant: ```c
void serveBMP(int socket) {
  char *message;
  message = "HTTP/1.0 200 OK\r\n"
            "Content-Type: image/bmp\r\n"
            "\r\n";
  printf("about to send=> %s\n", message);
  write(socket, message, strlen(message));
  writeHeader(socket);
  double x = 0.14;
  double y = 0.61;
  double zoom = 60.0;
  double zoom_x = x - 2.0 / zoom;
  double zoom_y = y - 2.0 / zoom;
  double seed[2] = {zoom_x, zoom_y};
  while (zoom_y < (y - 2.0 / zoom + 511 * (2.0 / zoom / 256.0))) {
    while (zoom_x < (x - 2.0 / zoom + 511 * (2.0 / zoom / 256.0))) {
      calcPoint(socket, seed, zoom_x, zoom_y, 0);
      zoom_x = zoom_x + 2.0 / zoom / 256.0;
      seed[0] = zoom_x;
    }
    zoom_y = zoom_y + 2.0 / zoom / 256.0;
    zoom_x = x - 2.0 / zoom;
    seed[0] = zoom_x;
    seed[1] = zoom_y;
  }
}
```