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

```asm
<gen_bit>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %edi,0xc(%rsp)
  mov    %esi,%r15d
  mov    %rdx,%r13
  mov    %ecx,%r14d
  mov    %rdx,%rsi
  lea    D81(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r14d,%edx
  mov    %r13,%rsi
  lea    D80(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  test   %r14d,%r14d
  jle    L6
  lea    -0x1(%r14),%r12d
  jmp    L49
L1:
  mov    $0x1,%ebx
  mov    %ebp,%ecx
  shl    %cl,%rbx
L37:
  mov    %ebx,%eax
  cmpl   $0x20,0xc(%rsp)
  cmove  %rax,%rbx
  lea    D38(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebp,%edx
  mov    $0xffffffff,%esi
  lea    D4(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebp,%edx
  mov    %r13,%rsi
  lea    D42(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbx,%rsi
  shr    $0x20,%rsi
  mov    %rbx,%rdx
  lea    D23(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D28(%rip),%rdi
  call   <puts@plt>
  sub    $0x1,%r12d
  cmp    $0xffffffff,%r12d
  je     L6
L49:
  lea    -0x1(%r14),%ebp
  sub    %r12d,%ebp
  test   %r15d,%r15d
  jne    L1
  mov    $0x1,%ebx
  mov    %r12d,%ecx
  shl    %cl,%rbx
  jmp    L37
L6:
  lea    D71(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  mov    %r13,%r8
  mov    %r14d,%ecx
  mov    %r13,%rdx
  mov    %r13,%rsi
  lea    D3(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: parse_data
arguments: data_label: D81
type_infered: string
name: parse_data
arguments: data_label: D80
type_infered: string
name: parse_data
arguments: data_label: D38
type_infered: string
name: parse_data
arguments: data_label: D4
type_infered: string
name: parse_data
arguments: data_label: D42
type_infered: string
name: parse_data
arguments: data_label: D23
type_infered: string
name: parse_data
arguments: data_label: D28
type_infered: string
name: parse_data
arguments: data_label: D71
type_infered: string
name: parse_data
arguments: data_label: D3
type_infered: string

tool: D81: 
/* Test the %s macro */


tool: D80: test_tuples %s_tuples[%d] = {


tool: D38:   { __LINE__, 

tool: D4: %d, %2d, 

tool: D42: %s (%2d), 

tool: D23: UNSIGNED64 (0x%08lx%08lx), 

tool: D28: },

tool: D71: };

tool: D3: test_spec %s_test = { __FILE__, "%s", 1, %d, %s_tuples, };


assistant: ```c
void gen_bit(int bitsize, int msb, const char *macro, int nr_bits) {
  int i;
  printf("\n/* Test the %s macro */\n", macro);
  printf("test_tuples %s_tuples[%d] = {\n", macro, nr_bits);
  for (i = 0; i < nr_bits; i++) {
    unsigned long long bit = 1;
    if (msb == 0)
      bit <<= nr_bits - i - 1;
    else
      bit <<= i;
    if (bitsize == 32)
      bit = (unsigned)bit;
    printf("  { __LINE__, ");
    printf("%d, %2d, ", -1, i);
    printf("%s (%2d), ", macro, i);
    printf("UNSIGNED64 (0x%08lx%08lx), ", (long)(bit >> 32), (long)bit);
    printf("},\n");
  }
  printf("};\n");
  printf("\n");
  printf("test_spec %s_test = { __FILE__, \"%s\", 1, %d, %s_tuples, };\n", macro, macro, nr_bits, macro);
  printf("\n");
}
```