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

```asm
<main>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    $0x32,%ebx
  cmp    $0x1,%edi
  jg     L18
L19:
  mov    %ebx,%esi
  lea    D14(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebx,%edi
  mov    $0x0,%eax
  call   <errorchecked_malloc@plt>
  movslq %eax,%rbx
  movabs $0x2073692073696854,%rax
  movabs $0x692079726f6d656d,%rdx
  mov    %rax,(%rbx)
  mov    %rdx,0x8(%rbx)
  movabs $0x657461636f6c2073,%rax
  movabs $0x656874206e6f2064,%rdx
  mov    %rax,0x10(%rbx)
  mov    %rdx,0x18(%rbx)
  movl   $0x61656820,0x20(%rbx)
  movw   $0x2e70,0x24(%rbx)
  movb   $0x0,0x26(%rbx)
  mov    %rbx,%rdx
  mov    %rbx,%rsi
  lea    D62(%rip),%r13
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D17(%rip),%rdi
  call   <puts@plt>
  mov    $0xc,%edi
  mov    $0x0,%eax
  call   <errorchecked_malloc@plt>
  movslq %eax,%rbp
  movl   $0x7a69,0x0(%rbp)
  mov    $0x7a69,%edx
  mov    %rbp,%rsi
  lea    D40(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D6(%rip),%r12
  mov    %r12,%rdi
  call   <puts@plt>
  mov    %rbx,%rdi
  call   <free@plt>
  lea    D4(%rip),%rdi
  call   <puts@plt>
  mov    $0xf,%edi
  mov    $0x0,%eax
  call   <errorchecked_malloc@plt>
  movslq %eax,%rbx
  movabs $0x6f6d656d2077656e,%rax
  mov    %rax,(%rbx)
  movw   $0x7972,0x8(%rbx)
  movb   $0x0,0xa(%rbx)
  mov    %rbx,%rdx
  mov    %rbx,%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D48(%rip),%rdi
  call   <puts@plt>
  mov    %rbp,%rdi
  call   <free@plt>
  mov    %r12,%rdi
  call   <puts@plt>
  mov    %rbx,%rdi
  call   <free@plt>
  mov    $0x0,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L18:
  mov    0x8(%rsi),%rdi
  mov    $0x0,%eax
  call   <atoi@plt>
  mov    %eax,%ebx
  jmp    L19
```

tool_calls: name: unpack_data
arguments: data_tag: D14
type_infered: string
name: unpack_data
arguments: data_tag: D62
type_infered: string
name: unpack_data
arguments: data_tag: D17
type_infered: string
name: unpack_data
arguments: data_tag: D40
type_infered: string
name: unpack_data
arguments: data_tag: D6
type_infered: string
name: unpack_data
arguments: data_tag: D4
type_infered: string
name: unpack_data
arguments: data_tag: D48
type_infered: string

tool: D14: 	[+] allocating %d bytes of memory on the heap for char_ptr


tool: D62: char_ptr (%p) --> '%s'


tool: D17: 	[+] allocating 12 bytes of memory on the heap for int_ptr

tool: D40: int_ptr (%p) --> %d


tool: D6: 	[-] freeing char_ptr's heap memory...

tool: D4: 	[+] allocating another 15 bytes for char_ptr

tool: D48: 	[-] freeing int_ptr's heap memory...

assistant: ```c
int main(int argc, char *argv[]) {
  char *char_ptr;
  int *int_ptr;
  int mem_size;
  if (argc < 2)
    mem_size = 50;
  else
    mem_size = atoi(argv[1]);
  printf("\t[+] allocating %d bytes of memory on the heap for char_ptr\n", mem_size);
  char_ptr = (char *)errorchecked_malloc(mem_size);
  strcpy(char_ptr, "This is memory is located on the heap.");
  printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);
  printf("\t[+] allocating 12 bytes of memory on the heap for int_ptr\n");
  int_ptr = (int *)errorchecked_malloc(12);
  *int_ptr = 31337;
  printf("int_ptr (%p) --> %d\n", int_ptr, *int_ptr);
  printf("\t[-] freeing char_ptr's heap memory...\n");
  free(char_ptr);
  printf("\t[+] allocating another 15 bytes for char_ptr\n");
  char_ptr = (char *)errorchecked_malloc(15);
  strcpy(char_ptr, "new memory");
  printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);
  printf("\t[-] freeing int_ptr's heap memory...\n");
  free(int_ptr);
  printf("\t[-] freeing char_ptr's heap memory...\n");
  free(char_ptr);
}
```