user: 下面的汇编指令对应的C源代码是什么：

```asm
<execute_cgi>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x758,%rsp
  mov    %edi,%ebx
  mov    %rsi,0x8(%rsp)
  mov    %rdx,(%rsp)
  mov    %rcx,0x10(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x748(%rsp)
  xor    %eax,%eax
  movb   $0x41,0x340(%rsp)
  movb   $0x0,0x341(%rsp)
  lea    D31(%rip),%rsi
  mov    %rdx,%rdi
  call   <strcasecmp@plt>
  lea    0x340(%rsp),%rbp
  lea    D18(%rip),%r13
  lea    D154(%rip),%r14
  test   %rax,%rax
  jne    L305
L166:
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L271
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    %rbp,%rsi
  mov    %ebx,%edi
  call   <get_line@plt>
  mov    %eax,%r12d
  mov    %rbp,%rsi
  mov    %r14,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  test   %r12d,%r12d
  jg     L166
  mov    $0xffffffff,%r12d
  jmp    L269
L271:
  mov    $0xffffffff,%r12d
L269:
  lea    0x340(%rsp),%rbp
  movabs $0x302e312f50545448,%rax
  movabs $0xd4b4f2030303220,%rdx
  mov    %rax,0x340(%rsp)
  mov    %rdx,0x348(%rsp)
  movw   $0xa,0x350(%rsp)
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    $0x0,%ecx
  mov    %rbp,%rsi
  mov    %ebx,%edi
  call   <send@plt>
  lea    0x30(%rsp),%rdi
  call   <pipe@plt>
  test   %rax,%rax
  js     L8
  lea    0x38(%rsp),%rdi
  call   <pipe@plt>
  test   %rax,%rax
  js     L303
  mov    $0x0,%eax
  call   <fork@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  js     L12
  jne    L117
  mov    $0x1,%esi
  mov    0x34(%rsp),%edi
  call   <dup2@plt>
  mov    $0x0,%esi
  mov    0x38(%rsp),%edi
  call   <dup2@plt>
  mov    0x30(%rsp),%edi
  call   <close@plt>
  mov    0x3c(%rsp),%edi
  call   <close@plt>
  lea    0x40(%rsp),%rbx
  mov    (%rsp),%r15
  mov    %r15,%rdx
  lea    D90(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  mov    %rbx,%rdi
  call   <putenv@plt>
  lea    D31(%rip),%rsi
  mov    %r15,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L78
  lea    0x140(%rsp),%rbx
  mov    0x10(%rsp),%rdx
  lea    D119(%rip),%rsi
  mov    %rbx,%rdi
  call   <snprintf@plt>
  mov    %rbx,%rdi
  call   <putenv@plt>
L287:
  mov    $0x0,%edx
  mov    0x8(%rsp),%rsi
  mov    %rsi,%rdi
  call   <execl@plt>
  test   %rax,%rax
  js     L139
L125:
  lea    D108(%rip),%rdi
  call   <puts@plt>
  mov    $0x0,%edi
  call   <exit@plt>
  jmp    L29
L305:
  lea    0x340(%rsp),%rbp
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    %rbp,%rsi
  mov    %ebx,%edi
  call   <get_line@plt>
  mov    %eax,0x1c(%rsp)
  mov    %rbp,%rsi
  lea    D101(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xffffffff,%r12d
  lea    D18(%rip),%r13
  lea    D80(%rip),%r15
  lea    D135(%rip),%r14
  cmpl   $0x0,0x1c(%rsp)
  jg     L74
  lea    D10(%rip),%rdi
  call   <puts@plt>
  jmp    L279
L156:
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    %rbp,%rsi
  mov    %ebx,%edi
  call   <get_line@plt>
  test   %eax,%eax
  jle    L90
L74:
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L90
  movb   $0x0,0x34f(%rsp)
  mov    %rbp,%rsi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L156
  lea    0x350(%rsp),%rdi
  call   <atoi@plt>
  mov    %eax,%r12d
  jmp    L156
L90:
  lea    D10(%rip),%rdi
  call   <puts@plt>
  cmp    $0xffffffff,%r12d
  jne    L269
L279:
  mov    %ebx,%edi
  call   <bad_request@plt>
  jmp    L29
L8:
  mov    %ebx,%edi
  call   <cannot_execute@plt>
L29:
  mov    0x748(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L82
  add    $0x758,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L303:
  mov    %ebx,%edi
  call   <cannot_execute@plt>
  jmp    L29
L12:
  mov    %ebx,%edi
  call   <cannot_execute@plt>
  jmp    L29
L78:
  lea    0x240(%rsp),%rdi
  mov    %r12d,%edx
  lea    D24(%rip),%rsi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L287
L139:
  lea    D81(%rip),%rdi
  call   <puts@plt>
  jmp    L125
L117:
  lea    D84(%rip),%rsi
  mov    (%rsp),%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  je     L188
L192:
  lea    0x2b(%rsp),%r12
  jmp    L299
L188:
  test   %r12d,%r12d
  jle    L192
  mov    $0x0,%r13d
  lea    0x2b(%rsp),%r14
L248:
  mov    $0x0,%ecx
  mov    $0x1,%edx
  mov    %r14,%rsi
  mov    %ebx,%edi
  call   <recv@plt>
  mov    $0x1,%edx
  mov    %r14,%rsi
  mov    0x3c(%rsp),%edi
  call   <write@plt>
  add    $0x1,%r13d
  cmp    %r13d,%r12d
  jne    L248
  jmp    L192
L69:
  mov    $0x0,%ecx
  mov    $0x1,%edx
  mov    %r12,%rsi
  mov    %ebx,%edi
  call   <send@plt>
L299:
  mov    $0x1,%edx
  mov    %r12,%rsi
  mov    0x30(%rsp),%edi
  call   <read@plt>
  test   %rax,%rax
  jg     L69
  mov    0x30(%rsp),%edi
  call   <close@plt>
  mov    0x3c(%rsp),%edi
  call   <close@plt>
  lea    0x2c(%rsp),%rsi
  mov    $0x0,%edx
  mov    %rbp,%rdi
  call   <waitpid@plt>
  jmp    L29
L82:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D31
type: string
name: extract_symbolic_data
arguments: data_tag: D18
type: string
name: extract_symbolic_data
arguments: data_tag: D154
type: string
name: extract_symbolic_data
arguments: data_tag: D90
type: string
name: extract_symbolic_data
arguments: data_tag: D119
type: string
name: extract_symbolic_data
arguments: data_tag: D108
type: string
name: extract_symbolic_data
arguments: data_tag: D101
type: string
name: extract_symbolic_data
arguments: data_tag: D80
type: string
name: extract_symbolic_data
arguments: data_tag: D135
type: string
name: extract_symbolic_data
arguments: data_tag: D10
type: string
name: extract_symbolic_data
arguments: data_tag: D24
type: string
name: extract_symbolic_data
arguments: data_tag: D81
type: string
name: extract_symbolic_data
arguments: data_tag: D84
type: string

tool: D31: GET

tool: D18: 


tool: D154: header: %s 


tool: D90: REQUEST_METHOD=%s

tool: D119: QUERY_STRING=%s

tool: D108: <p>come on cgi</p>

tool: D101: buf: %s


tool: D80: buf:%s 


tool: D135: Content-Length:

tool: D10: before bad_request 

tool: D24: CONTENT_LENGTH=%d

tool: D81: execl error

tool: D84: POST

assistant: ```c
void execute_cgi(int client, const char *path, const char *method, const char *query_string) {
  char buf[1024];
  int cgi_output[2];
  int cgi_input[2];
  pid_t pid;
  int status;
  int i;
  char c;
  int numchars = 1;
  int content_length = -1;
  buf[0] = 'A';
  buf[1] = '\0';
  if (strcasecmp(method, "GET") == 0)
    while ((numchars > 0) && strcmp("\n", buf)) {
      numchars = get_line(client, buf, strlen(buf));
      printf("header: %s \n", buf);
    }
  else {
    numchars = get_line(client, buf, strlen(buf));
    printf("buf: %s\n", buf);
    while ((numchars > 0) && strcmp("\n", buf)) {
      buf[15] = '\0';
      printf("buf:%s \n", buf);
      if (strcasecmp(buf, "Content-Length:") == 0) {
        content_length = atoi(&buf[16]);
      }
      numchars = get_line(client, buf, strlen(buf));
    }
    printf("before bad_request \n");
    if (content_length == -1) {
      bad_request(client);
      return;
    }
  }
  sprintf(buf, "HTTP/1.0 200 OK\r\n");
  send(client, buf, strlen(buf), 0);
  if (pipe(cgi_output) < 0) {
    cannot_execute(client);
    return;
  }
  if (pipe(cgi_input) < 0) {
    cannot_execute(client);
    return;
  }
  if ((pid = fork()) < 0) {
    cannot_execute(client);
    return;
  }
  if (pid == 0) {
    char meth_env[255];
    char query_env[255];
    char length_env[255];
    dup2(cgi_output[1], 1);
    dup2(cgi_input[0], 0);
    close(cgi_output[0]);
    close(cgi_input[1]);
    sprintf(meth_env, "REQUEST_METHOD=%s", method);
    putenv(meth_env);
    if (strcasecmp(method, "GET") == 0) {
      snprintf(query_env, "QUERY_STRING=%s", query_string);
      putenv(query_env);
    } else {
      sprintf(length_env, "CONTENT_LENGTH=%d", content_length);
    }
    if (execl(path, path, NULL) < 0) {
      printf("execl error\n");
    }
    printf("<p>come on cgi</p>\n");
    exit(0);
  } else {
    if (strcasecmp(method, "POST") == 0)
      for (i = 0; i < content_length; i++) {
        recv(client, &c, 1, 0);
        write(cgi_input[1], &c, 1);
      }
    while (read(cgi_output[0], &c, 1) > 0)
      send(client, &c, 1, 0);
    close(cgi_output[0]);
    close(cgi_input[1]);
    waitpid(pid, &status, 0);
  }
}
```