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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  movl   $0xffffffff,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  not    %eax
  mov    %eax,-0x14(%rbp)
  movl   $0xff000000,-0x10(%rbp)
  movl   $0xf0000000,-0xc(%rbp)
  movl   $0xffffff00,-0x8(%rbp)
  movl   $0xffffff0f,-0x4(%rbp)
  mov    -0x18(%rbp),%eax
  mov    %eax,%edi
  call   <exp_a@plt>
  mov    %eax,%esi
  lea    D78(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <exp_a@plt>
  mov    %eax,%esi
  lea    D50(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <exp_b@plt>
  mov    %eax,%esi
  lea    D38(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x18(%rbp),%eax
  mov    %eax,%edi
  call   <exp_b@plt>
  mov    %eax,%esi
  lea    D56(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x10(%rbp),%eax
  mov    %eax,%edi
  call   <exp_c@plt>
  mov    %eax,%esi
  lea    D22(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0xc(%rbp),%eax
  mov    %eax,%edi
  call   <exp_c@plt>
  mov    %eax,%esi
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <exp_d@plt>
  mov    %eax,%esi
  lea    D24(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <exp_d@plt>
  mov    %eax,%esi
  lea    D28(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: unpack_data
arguments: label: D78
type_infered: string
name: unpack_data
arguments: label: D50
type_infered: string
name: unpack_data
arguments: label: D38
type_infered: string
name: unpack_data
arguments: label: D56
type_infered: string
name: unpack_data
arguments: label: D22
type_infered: string
name: unpack_data
arguments: label: D64
type_infered: string
name: unpack_data
arguments: label: D24
type_infered: string
name: unpack_data
arguments: label: D28
type_infered: string

tool: D78: exp_a now should be 1 and the result is %d


tool: D50: exp_a now should be 0 and the result is %d


tool: D38: exp_b now should be 1 and the result is %d


tool: D56: exp_b now should be 0 and the result is %d


tool: D22: exp_c now should be 1 and the result is %d


tool: D64: exp_c now should be 0 and the result is %d


tool: D24: exp_d now should be 1 and the result is %d


tool: D28: exp_d now should be 0 and the result is %d


assistant: ```c
int main() {
  int all_bit_1 = ~0;
  int all_bit_0 = ~all_bit_1;
  int high_byte_1 = 0xFF000000;
  int high_byte_not_1 = 0xF0000000;
  int low_byte_0 = 0xFFFFFF00;
  int low_byte_not_0 = 0xFFFFFF0F;
  printf("exp_a now should be 1 and the result is %d\n", exp_a(all_bit_1));
  printf("exp_a now should be 0 and the result is %d\n", exp_a(all_bit_0));
  printf("exp_b now should be 1 and the result is %d\n", exp_b(all_bit_0));
  printf("exp_b now should be 0 and the result is %d\n", exp_b(all_bit_1));
  printf("exp_c now should be 1 and the result is %d\n", exp_c(high_byte_1));
  printf("exp_c now should be 0 and the result is %d\n", exp_c(high_byte_not_1));
  printf("exp_d now should be 1 and the result is %d\n", exp_d(low_byte_0));
  printf("exp_d now should be 0 and the result is %d\n", exp_d(low_byte_not_0));
  return 0;
}
```