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

```asm
<teste_macros>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  movl   $0x0,-0x8(%rbp)
  movl   $0x20,-0x4(%rbp)
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D53(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  call   <getchar@plt>
  movl   $0x0,-0xc(%rbp)
  jmp    L3
L21:
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <mostra_bin@plt>
  lea    D32(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0xc(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <mostra_bin@plt>
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  addl   $0x1,-0xc(%rbp)
L3:
  mov    -0x4(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,-0xc(%rbp)
  jl     L21
  lea    D63(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  call   <getchar@plt>
  movl   $0x0,-0xc(%rbp)
  jmp    L56
L24:
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <mostra_bin@plt>
  lea    D32(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0xc(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  not    %eax
  and    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <mostra_bin@plt>
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  addl   $0x1,-0xc(%rbp)
L56:
  mov    -0x4(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,-0xc(%rbp)
  jl     L24
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  call   <getchar@plt>
  movl   $0x0,-0xc(%rbp)
  jmp    L26
L34:
  mov    -0xc(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%edi
  call   <mostra_bin@plt>
  lea    D32(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0xc(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  xor    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <mostra_bin@plt>
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  addl   $0x1,-0xc(%rbp)
L26:
  mov    -0x4(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,-0xc(%rbp)
  jl     L34
  nop
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: data_tag: D14
type_guessed: string
name: read_data
arguments: data_tag: D53
type_guessed: string
name: read_data
arguments: data_tag: D32
type_guessed: string
name: read_data
arguments: data_tag: D34
type_guessed: string
name: read_data
arguments: data_tag: D63
type_guessed: string
name: read_data
arguments: data_tag: D8
type_guessed: string

tool: D14: :: TESTE DAS MACROS ::


tool: D53: 
Testando a macro set_bit(var,bit): 


tool: D32: 	 -> 	

tool: D34: 


tool: D63: 
Testando a macro clear_bit(var,bit): 


tool: D8: 
Testando a macro cpl_bit(var,bit): 


assistant: ```c
void teste_macros() {
  int i, portC = 0, size = 8 * sizeof(int);
  printf(":: TESTE DAS MACROS ::\n");
  printf("\nTestando a macro set_bit(var,bit): \n");
  getchar();
  for (i = 0; i < 2 * size; i++) {
    mostra_bin(portC);
    printf("\t -> \t");
    mostra_bin(portC |= (1 << i));
    printf("\n");
  }
  printf("\nTestando a macro clear_bit(var,bit): \n");
  getchar();
  for (i = 0; i < 2 * size; i++) {
    mostra_bin(portC);
    printf("\t -> \t");
    mostra_bin(portC &= ~(1 << i));
    printf("\n");
  }
  printf("\nTestando a macro cpl_bit(var,bit): \n");
  getchar();
  for (i = 0; i < 2 * size; i++) {
    mostra_bin(1 << i);
    printf("\t -> \t");
    mostra_bin(portC ^= (1 << i));
    printf("\n");
  }
}
```