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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x30(%rbp),%rdx
  mov    -0x24(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <test_init@plt>
  lea    D62(%rip),%rax
  mov    %rax,%rdi
  call   <getenv@plt>
  test   %rax,%rax
  setne  %al
  movzbl %al,%eax
  mov    %eax,-0x18(%rbp)
  lea    D105(%rip),%rax
  mov    %rax,%rdi
  call   <getenv@plt>
  test   %rax,%rax
  setne  %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <getenv@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  je     L32
  mov    -0x8(%rbp),%rax
  lea    D93(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  je     L32
  mov    $0x1,%eax
  jmp    L154
L32:
  mov    $0x0,%eax
L154:
  mov    %eax,-0x10(%rbp)
  mov    $0x2000000,%edi
  call   <malloc@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L120
  cmpl   $0x0,-0x14(%rbp)
  je     L150
  cmpl   $0x0,-0x10(%rbp)
  je     L150
  mov    $0x0,%eax
  call   <cleanup@plt>
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%edi
  call   <exit@plt>
  jmp    L120
L150:
  mov    $0x0,%eax
  call   <cleanup@plt>
  mov    $0x2000000,%esi
  lea    D49(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x2,%edi
  call   <exit@plt>
L120:
  mov    -0x8(%rbp),%rax
  mov    $0x2000000,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x8(%rbp),%rax
  add    $0x1ffffff,%rax
  mov    %rax,%rdi
  call   <test_addr_huge@plt>
  cmp    $0x1,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  je     L69
  cmpl   $0x0,-0xc(%rbp)
  jne    L69
  cmpl   $0x0,-0x14(%rbp)
  je     L95
  cmpl   $0x0,-0x10(%rbp)
  je     L95
  mov    $0x0,%eax
  call   <cleanup@plt>
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%edi
  call   <exit@plt>
  jmp    L69
L95:
  mov    $0x0,%eax
  call   <cleanup@plt>
  lea    D98(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x2,%edi
  call   <exit@plt>
L69:
  cmpl   $0x0,-0x18(%rbp)
  jne    L29
  cmpl   $0x0,-0xc(%rbp)
  je     L29
  mov    $0x0,%eax
  call   <cleanup@plt>
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x2,%edi
  call   <exit@plt>
L29:
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  cmpl   $0x0,-0x14(%rbp)
  je     L70
  mov    -0x8(%rbp),%rax
  add    $0x1ffffff,%rax
  mov    %rax,%rdi
  call   <test_addr_huge@plt>
  cmp    $0x1,%eax
  jne    L70
  mov    $0x0,%eax
  call   <cleanup@plt>
  lea    D60(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x2,%edi
  call   <exit@plt>
L70:
  mov    $0x0,%eax
  call   <cleanup@plt>
  lea    D40(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%edi
  call   <exit@plt>
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D62
type_guessed: string
name: parse_data
arguments: label: D105
type_guessed: string
name: parse_data
arguments: label: D8
type_guessed: string
name: parse_data
arguments: label: D93
type_guessed: string
name: parse_data
arguments: label: D12
type_guessed: string
name: parse_data
arguments: label: D49
type_guessed: string
name: parse_data
arguments: label: D98
type_guessed: string
name: parse_data
arguments: label: D4
type_guessed: string
name: parse_data
arguments: label: D60
type_guessed: string
name: parse_data
arguments: label: D40
type_guessed: string

tool: D62: HUGETLB_MORECORE

tool: D105: HUGETLB_MORECORE_SHRINK

tool: D8: LD_PRELOAD

tool: D93: heapshrink

tool: D12: PASS (inconclusive)

tool: D49: FAIL	malloc(%d) failed



tool: D98: FAIL	Heap not on hugepages

tool: D4: FAIL	Heap unexpectedly on hugepages

tool: D60: FAIL	Heap did not shrink

tool: D40: PASS

assistant: ```c
int main(int argc, char **argv) {
  int is_huge, have_env, shrink_ok, have_helper;
  void *p;
  test_init(argc, argv);
  have_env = getenv("HUGETLB_MORECORE") != NULL;
  shrink_ok = getenv("HUGETLB_MORECORE_SHRINK") != NULL;
  p = getenv("LD_PRELOAD");
  have_helper = p != NULL && strstr(p, "heapshrink") != NULL;
  p = malloc((32 * 1024 * 1024));
  if (!p) {
    if (shrink_ok && have_helper) {
      do {
        cleanup();
        printf("PASS (inconclusive)\n");
        exit(0);
      } while (0);
    } else
      do {
        cleanup();
        printf("FAIL\t"
               "malloc(%d) failed\n"
               "\n",
               (32 * 1024 * 1024));
        exit(2);
      } while (0);
  }
  memset(p, 0, (32 * 1024 * 1024));
  is_huge = test_addr_huge(p + (32 * 1024 * 1024) - 1) == 1;
  if (have_env && !is_huge) {
    if (shrink_ok && have_helper) {
      do {
        cleanup();
        printf("PASS (inconclusive)\n");
        exit(0);
      } while (0);
    } else
      do {
        cleanup();
        printf("FAIL\t"
               "Heap not on hugepages"
               "\n");
        exit(2);
      } while (0);
  }
  if (!have_env && is_huge)
    do {
      cleanup();
      printf("FAIL\t"
             "Heap unexpectedly on hugepages"
             "\n");
      exit(2);
    } while (0);
  free(p);
  if (shrink_ok && test_addr_huge(p + (32 * 1024 * 1024) - 1) == 1)
    do {
      cleanup();
      printf("FAIL\t"
             "Heap did not shrink"
             "\n");
      exit(2);
    } while (0);
  do {
    cleanup();
    printf("PASS\n");
    exit(0);
  } while (0);
}
```