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

```asm
<execute_cgi>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x748,%rsp
  mov    %edi,%ebx
  mov    %rsi,%r13
  mov    %rdx,%r12
  mov    %rcx,-0x768(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x38(%rbp)
  xor    %eax,%eax
  movb   $0x41,-0x440(%rbp)
  movb   $0x0,-0x43f(%rbp)
  lea    D97(%rip),%rsi
  mov    %rdx,%rdi
  call   <strcasecmp@plt>
  lea    D115(%rip),%r14
  test   %rax,%rax
  jne    L134
L238:
  lea    -0x440(%rbp),%rsi
  mov    %r14,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L239
  lea    -0x440(%rbp),%rsi
  mov    $0x400,%edx
  mov    %ebx,%edi
  call   <get_line@plt>
  test   %eax,%eax
  jg     L238
  mov    $0xffffffff,%r14d
  jmp    L294
L239:
  mov    $0xffffffff,%r14d
L294:
  lea    -0x440(%rbp),%r15
  movabs $0x302e312f50545448,%rax
  movabs $0xd4b4f2030303220,%rdx
  mov    %rax,-0x440(%rbp)
  mov    %rdx,-0x438(%rbp)
  movw   $0xa,-0x430(%rbp)
  mov    %r15,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    $0x0,%ecx
  mov    %r15,%rsi
  mov    %ebx,%edi
  call   <send@plt>
  lea    -0x750(%rbp),%rdi
  call   <pipe@plt>
  test   %rax,%rax
  js     L159
  lea    -0x748(%rbp),%rdi
  call   <pipe@plt>
  test   %rax,%rax
  js     L20
  mov    $0x0,%eax
  call   <fork@plt>
  mov    %rax,%r15
  test   %rax,%rax
  js     L186
  jne    L256
  mov    %r13,%rdi
  call   <strlen@plt>
  cltq
  cmpb   $0x2e,-0x2(%r13,%rax,1)
  je     L320
L373:
  mov    $0x1,%esi
  mov    -0x74c(%rbp),%edi
  call   <dup2@plt>
  mov    $0x0,%esi
  mov    -0x748(%rbp),%edi
  call   <dup2@plt>
  mov    -0x750(%rbp),%edi
  call   <close@plt>
  mov    -0x744(%rbp),%edi
  call   <close@plt>
  lea    -0x740(%rbp),%rbx
  mov    %r12,%rdx
  lea    D58(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  mov    %rbx,%rdi
  call   <putenv@plt>
  lea    D97(%rip),%rsi
  mov    %r12,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L398
  lea    -0x640(%rbp),%rbx
  mov    -0x768(%rbp),%rdx
  lea    D19(%rip),%rsi
  mov    %rbx,%rdi
  call   <sprintf@plt>
  mov    %rbx,%rdi
  call   <putenv@plt>
L247:
  mov    $0x0,%edx
  mov    %r13,%rsi
  mov    %r13,%rdi
  call   <execl@plt>
  mov    $0x0,%edi
  call   <exit@plt>
  jmp    L351
L134:
  lea    D118(%rip),%rsi
  mov    %r12,%rdi
  call   <strcasecmp@plt>
  mov    $0xffffffff,%r14d
  test   %rax,%rax
  jne    L294
  lea    -0x440(%rbp),%rsi
  mov    $0x400,%edx
  mov    %ebx,%edi
  call   <get_line@plt>
  lea    -0x440(%rbp),%r15
  lea    -0x430(%rbp),%rcx
  mov    %rcx,-0x770(%rbp)
  test   %eax,%eax
  jg     L226
  jmp    L399
L416:
  mov    $0x400,%edx
  mov    %r15,%rsi
  mov    %ebx,%edi
  call   <get_line@plt>
  test   %eax,%eax
  jle    L417
L226:
  mov    %r15,%rsi
  lea    D115(%rip),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L417
  movb   $0x0,-0x431(%rbp)
  lea    D135(%rip),%rsi
  mov    %r15,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L416
  mov    -0x770(%rbp),%rdi
  call   <atoi@plt>
  mov    %eax,%r14d
  jmp    L416
L417:
  cmp    $0xffffffff,%r14d
  jne    L294
L399:
  mov    %ebx,%edi
  call   <bad_request@plt>
  jmp    L351
L159:
  mov    %ebx,%edi
  call   <cannot_execute@plt>
L351:
  mov    -0x38(%rbp),%rax
  sub    %fs:0x28,%rax
  jne    L356
  lea    -0x28(%rbp),%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
L20:
  mov    %ebx,%edi
  call   <cannot_execute@plt>
  jmp    L351
L186:
  mov    %ebx,%edi
  call   <cannot_execute@plt>
  jmp    L351
L320:
  mov    %r13,%rdi
  call   <strlen@plt>
  cltq
  cmpb   $0x63,-0x1(%r13,%rax,1)
  jne    L373
  mov    %rsp,-0x770(%rbp)
  lea    0x1(%r14),%ebx
  movslq %ebx,%rax
  add    $0xf,%rax
  mov    %rax,%rdx
  and    $0xfffffffffffffff0,%rdx
  and    $0xfffffffffffff000,%rax
  mov    %rsp,%rcx
  sub    %rax,%rcx
L371:
  cmp    %rcx,%rsp
  je     L149
  sub    $0x1000,%rsp
  orq    $0x0,0xff8(%rsp)
  jmp    L371
L149:
  mov    %rdx,%rax
  and    $0xfff,%eax
  sub    %rax,%rsp
  test   %rax,%rax
  je     L184
  orq    $0x0,-0x8(%rsp,%rax,1)
L184:
  mov    %rsp,%r15
  lea    D97(%rip),%rsi
  mov    %r12,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L225
  mov    -0x768(%rbp),%rsi
  lea    D132(%rip),%rdi
  call   <printf@plt>
L374:
  lea    D146(%rip),%rsi
  mov    %r13,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  je     L200
L127:
  mov    -0x770(%rbp),%rsp
  jmp    L351
L225:
  lea    D118(%rip),%rsi
  mov    %r12,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L374
  mov    %ebx,%edx
  mov    $0x0,%esi
  mov    %r15,%rdi
  call   <memset@plt>
  mov    %r14d,%edx
  mov    %r15,%rsi
  mov    -0x748(%rbp),%edi
  call   <read@plt>
  jmp    L374
L200:
  mov    %r14d,%esi
  mov    %r15,%rdi
  call   <processMotorControl@plt>
  jmp    L127
L398:
  lea    D118(%rip),%rsi
  mov    %r12,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L247
  lea    -0x540(%rbp),%rbx
  mov    %r14d,%edx
  lea    D7(%rip),%rsi
  mov    %rbx,%rdi
  call   <sprintf@plt>
  mov    %rbx,%rdi
  call   <putenv@plt>
  jmp    L247
L256:
  mov    -0x74c(%rbp),%edi
  call   <close@plt>
  mov    -0x748(%rbp),%edi
  call   <close@plt>
  lea    D118(%rip),%rsi
  mov    %r12,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  je     L313
L2:
  lea    -0x755(%rbp),%r12
  jmp    L91
L313:
  test   %r14d,%r14d
  jle    L2
  mov    $0x0,%r12d
  lea    -0x755(%rbp),%r13
L82:
  mov    $0x0,%ecx
  mov    $0x1,%edx
  mov    %r13,%rsi
  mov    %ebx,%edi
  call   <recv@plt>
  mov    $0x1,%edx
  mov    %r13,%rsi
  mov    -0x744(%rbp),%edi
  call   <write@plt>
  add    $0x1,%r12d
  cmp    %r12d,%r14d
  jne    L82
  jmp    L2
L309:
  mov    $0x0,%ecx
  mov    $0x1,%edx
  mov    %r12,%rsi
  mov    %ebx,%edi
  call   <send@plt>
L91:
  mov    $0x1,%edx
  mov    %r12,%rsi
  mov    -0x750(%rbp),%edi
  call   <read@plt>
  test   %rax,%rax
  jg     L309
  mov    -0x750(%rbp),%edi
  call   <close@plt>
  mov    -0x744(%rbp),%edi
  call   <close@plt>
  lea    -0x754(%rbp),%rsi
  mov    $0x0,%edx
  mov    %r15,%rdi
  call   <waitpid@plt>
  jmp    L351
L356:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D97
type_guessed: string
name: disassemble_data
arguments: data_tag: D115
type_guessed: string
name: disassemble_data
arguments: data_tag: D58
type_guessed: string
name: disassemble_data
arguments: data_tag: D19
type_guessed: string
name: disassemble_data
arguments: data_tag: D118
type_guessed: string
name: disassemble_data
arguments: data_tag: D135
type_guessed: string
name: disassemble_data
arguments: data_tag: D132
type_guessed: string
name: disassemble_data
arguments: data_tag: D146
type_guessed: string
name: disassemble_data
arguments: data_tag: D7
type_guessed: string

tool: D97: GET

tool: D115: 


tool: D58: REQUEST_METHOD=%s

tool: D19: QUERY_STRING=%s

tool: D118: POST

tool: D135: Content-Length:

tool: D132: C GET: %s


tool: D146: htdocs/motor_control.c

tool: D7: CONTENT_LENGTH=%d

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, sizeof(buf));
    }
  } else if (strcasecmp(method, "POST") == 0) {
    numchars = get_line(client, buf, sizeof(buf));
    while ((numchars > 0) && strcmp("\n", buf)) {
      buf[15] = '\0';
      if (strcasecmp(buf, "Content-Length:") == 0) {
        content_length = atoi(&(buf[16]));
      }
      numchars = get_line(client, buf, sizeof(buf));
    }
    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) {
    if (path[strlen(path) - 2] == '.' && path[strlen(path) - 1] == 'c') {
      char postContent[content_length + 1];
      if (strcasecmp(method, "GET") == 0) {
        printf("C GET: %s\n", query_string);
      } else if (strcasecmp(method, "POST") == 0) {
        memset(postContent, 0, content_length + 1);
        read(cgi_input[0], postContent, content_length);
      }
      if (0 == strcasecmp(path, "htdocs/motor_control.c")) {
        processMotorControl(postContent, content_length);
      }
    } else {
      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) {
        sprintf(query_env, "QUERY_STRING=%s", query_string);
        putenv(query_env);
      } else if (strcasecmp(method, "POST") == 0) {
        sprintf(length_env, "CONTENT_LENGTH=%d", content_length);
        putenv(length_env);
      }
      execl(path, path, NULL);
      exit(0);
    }
  } else {
    close(cgi_output[1]);
    close(cgi_input[0]);
    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);
  }
}
```