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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    D165(%rip),%rax
  mov    (%rax),%edx
  mov    D20(%rip),%rax
  mov    (%rax),%eax
  or     %eax,%edx
  mov    D158(%rip),%rax
  mov    (%rax),%ecx
  mov    D28(%rip),%rax
  mov    (%rax),%eax
  or     %ecx,%eax
  mov    $0x0,%r9d
  mov    $0xffffffff,%r8d
  mov    %edx,%ecx
  mov    %eax,%edx
  mov    $0x0,%esi
  mov    $0x0,%edi
  call   <mmap@plt>
  mov    %rax,-0x10(%rbp)
  mov    D70(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x10(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    D165(%rip),%rax
  mov    (%rax),%edx
  mov    D20(%rip),%rax
  mov    (%rax),%eax
  or     %eax,%edx
  mov    D158(%rip),%rax
  mov    (%rax),%ecx
  mov    D28(%rip),%rax
  mov    (%rax),%eax
  or     %ecx,%eax
  mov    $0x0,%r9d
  mov    $0xffffffff,%r8d
  mov    %edx,%ecx
  mov    %eax,%edx
  mov    $0x1000,%esi
  mov    $0x0,%edi
  call   <mmap@plt>
  mov    %rax,-0x10(%rbp)
  mov    D70(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x10(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x10(%rbp),%rax
  mov    $0x1000,%esi
  mov    %rax,%rdi
  call   <munmap@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    D165(%rip),%rax
  mov    (%rax),%edx
  mov    D20(%rip),%rax
  mov    (%rax),%eax
  or     %eax,%edx
  mov    D158(%rip),%rax
  mov    (%rax),%ecx
  mov    D28(%rip),%rax
  mov    (%rax),%eax
  or     %ecx,%eax
  mov    $0x0,%r9d
  mov    $0xffffffff,%r8d
  mov    %edx,%ecx
  mov    %eax,%edx
  mov    $0xa000,%esi
  mov    $0x0,%edi
  call   <mmap@plt>
  mov    %rax,-0x10(%rbp)
  mov    D70(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x10(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x10(%rbp),%rax
  mov    $0x1000,%esi
  mov    %rax,%rdi
  call   <munmap@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  addq   $0x1000,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  add    $0x8000,%rax
  mov    $0x1000,%esi
  mov    %rax,%rdi
  call   <munmap@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x10(%rbp),%rax
  add    $0x1000,%rax
  mov    $0x1000,%esi
  mov    %rax,%rdi
  call   <munmap@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    D165(%rip),%rax
  mov    (%rax),%edx
  mov    D20(%rip),%rax
  mov    (%rax),%eax
  mov    %edx,%ecx
  or     %eax,%ecx
  mov    D158(%rip),%rax
  mov    (%rax),%edx
  mov    D28(%rip),%rax
  mov    (%rax),%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x1000,%rax
  mov    $0x0,%r9d
  mov    $0xffffffff,%r8d
  mov    $0x1000,%esi
  mov    %rax,%rdi
  call   <mmap@plt>
  mov    %rax,-0x8(%rbp)
  mov    D70(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x8(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x10(%rbp),%rax
  mov    $0x8000,%esi
  mov    %rax,%rdi
  call   <munmap@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  leave
  ret
```

assistant: ```c
int main() {
  int ret;
  void *alloc = mmap(NULL, 0, PROT_EXEC | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  assert(alloc == MAP_FAILED);
  alloc = mmap(NULL, 4096, PROT_EXEC | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  assert(alloc != MAP_FAILED);
  ret = munmap(alloc, 4096);
  assert(ret == 0);
  alloc = mmap(NULL, 4096 * 10, PROT_EXEC | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  assert(alloc != MAP_FAILED);
  ret = munmap(alloc, 4096);
  assert(ret == 0);
  alloc += 4096;
  ret = munmap(alloc + 4096 * 8, 4096);
  assert(ret == 0);
  ret = munmap(alloc + 4096, 4096);
  assert(ret == 0);
  void *alloc2 = mmap(alloc + 4096, 4096, PROT_EXEC | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  assert(alloc2 != MAP_FAILED);
  ret = munmap(alloc, 4096 * 8);
  assert(ret == 0);
  return 0;
}
```