user: What would the C source look like for the assembly code provided here:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rsi,%r12
  cmp    $0x4,%edi
  jne    L144
L107:
  mov    0x8(%r12),%rdi
  lea    D351(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L84
L137:
  mov    0x10(%r12),%rdi
  lea    D323(%rip),%rsi
  call   <strcmp@plt>
  mov    $0x20,%ebx
  mov    $0x0,%r13d
  lea    D238(%rip),%rbp
  test   %rax,%rax
  jne    L85
L15:
  mov    0x18(%r12),%rdi
  lea    D644(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L50
  mov    %ebx,%esi
  lea    D374(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r13d,%esi
  lea    D1(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x20,%esi
  lea    D388(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D317(%rip),%rsi
L122:
  lea    D35(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    D446(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    D472(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    D422(%rip),%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  call   <gen_struct@plt>
  lea    D455(%rip),%rdi
  call   <puts@plt>
  mov    $0x4,%ecx
  lea    D702(%rip),%rdx
  mov    %r13d,%esi
  mov    $0x4,%edi
  call   <gen_bit@plt>
  mov    $0x5,%ecx
  lea    D316(%rip),%rdx
  mov    %r13d,%esi
  mov    $0x5,%edi
  call   <gen_bit@plt>
  mov    $0x8,%ecx
  lea    D12(%rip),%rdx
  mov    %r13d,%esi
  mov    $0x8,%edi
  call   <gen_bit@plt>
  mov    $0xa,%ecx
  lea    D46(%rip),%rdx
  mov    %r13d,%esi
  mov    $0xa,%edi
  call   <gen_bit@plt>
  mov    $0x10,%ecx
  lea    D318(%rip),%rdx
  mov    %r13d,%esi
  mov    $0x10,%edi
  call   <gen_bit@plt>
  mov    $0x20,%ecx
  lea    D367(%rip),%r12
  mov    %r12,%rdx
  mov    %r13d,%esi
  mov    $0x20,%edi
  call   <gen_bit@plt>
  mov    $0x40,%ecx
  lea    D530(%rip),%rdx
  mov    %r13d,%esi
  mov    $0x40,%edi
  call   <gen_bit@plt>
  mov    $0x40,%ecx
  lea    D423(%rip),%r15
  mov    %r15,%rdx
  mov    %r13d,%esi
  mov    %ebx,%edi
  call   <gen_bit@plt>
  mov    $0x8,%ecx
  lea    D212(%rip),%rdx
  mov    $0x7,%esi
  mov    $0x8,%edi
  call   <gen_bit@plt>
  mov    $0x10,%ecx
  lea    D105(%rip),%rdx
  mov    $0xf,%esi
  mov    $0x10,%edi
  call   <gen_bit@plt>
  mov    $0x20,%ecx
  lea    D172(%rip),%rdx
  mov    $0x1f,%esi
  mov    $0x20,%edi
  call   <gen_bit@plt>
  mov    $0x40,%ecx
  lea    D695(%rip),%rdx
  mov    $0x3f,%esi
  mov    $0x40,%edi
  call   <gen_bit@plt>
  lea    -0x1(%rbx),%esi
  mov    $0x40,%ecx
  lea    D33(%rip),%r14
  mov    %r14,%rdx
  mov    %ebx,%edi
  call   <gen_bit@plt>
  mov    $0x8,%ecx
  lea    D469(%rip),%rdx
  mov    $0x0,%esi
  mov    $0x8,%edi
  call   <gen_bit@plt>
  mov    $0x10,%ecx
  lea    D144(%rip),%rdx
  mov    $0x0,%esi
  mov    $0x10,%edi
  call   <gen_bit@plt>
  mov    $0x20,%ecx
  lea    D257(%rip),%rdx
  mov    $0x0,%esi
  mov    $0x20,%edi
  call   <gen_bit@plt>
  mov    $0x40,%ecx
  lea    D131(%rip),%rdx
  mov    $0x0,%esi
  mov    $0x40,%edi
  call   <gen_bit@plt>
  mov    $0x40,%ecx
  lea    D647(%rip),%r13
  mov    %r13,%rdx
  mov    $0x0,%esi
  mov    %ebx,%edi
  call   <gen_bit@plt>
  lea    D307(%rip),%rdi
  call   <puts@plt>
  lea    D225(%rip),%rdi
  call   <puts@plt>
  lea    D709(%rip),%rdi
  call   <puts@plt>
  lea    D598(%rip),%rdi
  call   <puts@plt>
  lea    D629(%rip),%rdi
  call   <puts@plt>
  lea    D277(%rip),%rdi
  call   <puts@plt>
  lea    D676(%rip),%rdi
  call   <puts@plt>
  lea    D451(%rip),%rdi
  call   <puts@plt>
  lea    D550(%rip),%rdi
  call   <puts@plt>
  lea    D346(%rip),%rdi
  call   <puts@plt>
  lea    D413(%rip),%rdi
  call   <puts@plt>
  lea    D753(%rip),%rdi
  call   <puts@plt>
  lea    D868(%rip),%rdi
  call   <puts@plt>
  lea    D106(%rip),%rdi
  call   <puts@plt>
  lea    D860(%rip),%rdi
  call   <puts@plt>
  lea    D15(%rip),%rdi
  call   <puts@plt>
  lea    D794(%rip),%rdi
  call   <puts@plt>
  lea    D867(%rip),%rdi
  call   <puts@plt>
  lea    D109(%rip),%rdi
  call   <puts@plt>
  lea    D551(%rip),%rdi
  call   <puts@plt>
  lea    D471(%rip),%rdi
  call   <puts@plt>
  mov    $0x40,%esi
  mov    %r15,%rdi
  call   <gen_enum@plt>
  mov    $0x40,%esi
  mov    %r14,%rdi
  call   <gen_enum@plt>
  mov    $0x40,%esi
  mov    %r13,%rdi
  call   <gen_enum@plt>
  mov    $0x20,%esi
  mov    %r12,%rdi
  call   <gen_enum@plt>
  mov    $0x20,%esi
  lea    D172(%rip),%rdi
  call   <gen_enum@plt>
  mov    $0x20,%esi
  lea    D257(%rip),%rdi
  call   <gen_enum@plt>
  lea    D626(%rip),%rdi
  call   <puts@plt>
  mov    $0x8,%ecx
  lea    D207(%rip),%rdx
  mov    %rbp,%rsi
  mov    $0x8,%edi
  call   <gen_mask@plt>
  mov    $0x10,%ecx
  lea    D600(%rip),%rdx
  mov    %rbp,%rsi
  mov    $0x10,%edi
  call   <gen_mask@plt>
  mov    $0x20,%ecx
  lea    D854(%rip),%rdx
  mov    %rbp,%rsi
  mov    $0x20,%edi
  call   <gen_mask@plt>
  mov    $0x40,%ecx
  lea    D736(%rip),%rdx
  mov    %rbp,%rsi
  mov    $0x40,%edi
  call   <gen_mask@plt>
  mov    $0x40,%ecx
  lea    D478(%rip),%rdx
  mov    %rbp,%rsi
  mov    %ebx,%edi
  call   <gen_mask@plt>
  lea    D93(%rip),%rdi
  call   <puts@plt>
  lea    D273(%rip),%rdi
  call   <puts@plt>
  lea    D601(%rip),%rdi
  call   <puts@plt>
  lea    D474(%rip),%rdi
  call   <puts@plt>
  lea    D407(%rip),%rdi
  call   <puts@plt>
  lea    D718(%rip),%rdi
  call   <puts@plt>
  lea    D551(%rip),%rdi
  call   <puts@plt>
  lea    D471(%rip),%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L144:
  mov    $0x1,%edi
  call   <usage@plt>
  jmp    L107
L84:
  mov    0x8(%r12),%rdi
  lea    D560(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L44
  mov    0x10(%r12),%rdi
  lea    D323(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L110
  mov    $0x40,%ebx
  mov    $0x0,%r13d
  lea    D238(%rip),%rbp
  jmp    L15
L44:
  mov    $0x2,%edi
  call   <usage@plt>
  jmp    L137
L85:
  mov    0x10(%r12),%rdi
  lea    D456(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L123
  mov    0x10(%r12),%rdi
  lea    D73(%rip),%rsi
  call   <strcmp@plt>
  mov    $0x20,%ebx
L32:
  mov    $0x3,%edi
  call   <usage@plt>
  test   %r13d,%r13d
  lea    D238(%rip),%rbp
  lea    D180(%rip),%rax
  cmovne %rax,%rbp
  jmp    L15
L123:
  mov    $0x20,%ebx
  mov    $0x1f,%r13d
  lea    D180(%rip),%rbp
  jmp    L15
L50:
  mov    0x18(%r12),%rdi
  lea    D671(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L49
  mov    %ebx,%esi
  lea    D374(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r13d,%esi
  lea    D1(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x20,%esi
  lea    D388(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D641(%rip),%rsi
  jmp    L122
L49:
  mov    $0x4,%edi
  call   <usage@plt>
  mov    %ebx,%esi
  lea    D374(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r13d,%esi
  lea    D1(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x20,%esi
  lea    D388(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D641(%rip),%rsi
  jmp    L122
L110:
  mov    0x10(%r12),%rdi
  lea    D456(%rip),%rsi
  call   <strcmp@plt>
  mov    0x10(%r12),%rdi
  lea    D73(%rip),%rsi
  call   <strcmp@plt>
  mov    $0x40,%ebx
  test   %rax,%rax
  jne    L32
  mov    $0x40,%ebx
  mov    $0x3f,%r13d
  lea    D180(%rip),%rbp
  jmp    L15
```

tool_calls: name: disassemble_data
arguments: data_tag: D351
datatype: string
name: disassemble_data
arguments: data_tag: D323
datatype: string
name: disassemble_data
arguments: data_tag: D238
datatype: string
name: disassemble_data
arguments: data_tag: D644
datatype: string
name: disassemble_data
arguments: data_tag: D374
datatype: string
name: disassemble_data
arguments: data_tag: D1
datatype: string
name: disassemble_data
arguments: data_tag: D388
datatype: string
name: disassemble_data
arguments: data_tag: D317
datatype: string
name: disassemble_data
arguments: data_tag: D35
datatype: string
name: disassemble_data
arguments: data_tag: D446
datatype: string
name: disassemble_data
arguments: data_tag: D472
datatype: string
name: disassemble_data
arguments: data_tag: D422
datatype: string
name: disassemble_data
arguments: data_tag: D455
datatype: string
name: disassemble_data
arguments: data_tag: D702
datatype: string
name: disassemble_data
arguments: data_tag: D316
datatype: string
name: disassemble_data
arguments: data_tag: D12
datatype: string
name: disassemble_data
arguments: data_tag: D46
datatype: string
name: disassemble_data
arguments: data_tag: D318
datatype: string
name: disassemble_data
arguments: data_tag: D367
datatype: string
name: disassemble_data
arguments: data_tag: D530
datatype: string
name: disassemble_data
arguments: data_tag: D423
datatype: string
name: disassemble_data
arguments: data_tag: D212
datatype: string
name: disassemble_data
arguments: data_tag: D105
datatype: string
name: disassemble_data
arguments: data_tag: D172
datatype: string
name: disassemble_data
arguments: data_tag: D695
datatype: string
name: disassemble_data
arguments: data_tag: D33
datatype: string
name: disassemble_data
arguments: data_tag: D469
datatype: string
name: disassemble_data
arguments: data_tag: D144
datatype: string
name: disassemble_data
arguments: data_tag: D257
datatype: string
name: disassemble_data
arguments: data_tag: D131
datatype: string
name: disassemble_data
arguments: data_tag: D647
datatype: string
name: disassemble_data
arguments: data_tag: D307
datatype: string
name: disassemble_data
arguments: data_tag: D225
datatype: string
name: disassemble_data
arguments: data_tag: D709
datatype: string
name: disassemble_data
arguments: data_tag: D598
datatype: string
name: disassemble_data
arguments: data_tag: D629
datatype: string
name: disassemble_data
arguments: data_tag: D277
datatype: string
name: disassemble_data
arguments: data_tag: D676
datatype: string
name: disassemble_data
arguments: data_tag: D451
datatype: string
name: disassemble_data
arguments: data_tag: D550
datatype: string
name: disassemble_data
arguments: data_tag: D346
datatype: string
name: disassemble_data
arguments: data_tag: D413
datatype: string
name: disassemble_data
arguments: data_tag: D753
datatype: string
name: disassemble_data
arguments: data_tag: D868
datatype: string
name: disassemble_data
arguments: data_tag: D106
datatype: string
name: disassemble_data
arguments: data_tag: D860
datatype: string
name: disassemble_data
arguments: data_tag: D15
datatype: string
name: disassemble_data
arguments: data_tag: D794
datatype: string
name: disassemble_data
arguments: data_tag: D867
datatype: string
name: disassemble_data
arguments: data_tag: D109
datatype: string
name: disassemble_data
arguments: data_tag: D551
datatype: string
name: disassemble_data
arguments: data_tag: D471
datatype: string
name: disassemble_data
arguments: data_tag: D626
datatype: string
name: disassemble_data
arguments: data_tag: D207
datatype: string
name: disassemble_data
arguments: data_tag: D600
datatype: string
name: disassemble_data
arguments: data_tag: D854
datatype: string
name: disassemble_data
arguments: data_tag: D736
datatype: string
name: disassemble_data
arguments: data_tag: D478
datatype: string
name: disassemble_data
arguments: data_tag: D93
datatype: string
name: disassemble_data
arguments: data_tag: D273
datatype: string
name: disassemble_data
arguments: data_tag: D601
datatype: string
name: disassemble_data
arguments: data_tag: D474
datatype: string
name: disassemble_data
arguments: data_tag: D407
datatype: string
name: disassemble_data
arguments: data_tag: D718
datatype: string
name: disassemble_data
arguments: data_tag: D560
datatype: string
name: disassemble_data
arguments: data_tag: D456
datatype: string
name: disassemble_data
arguments: data_tag: D73
datatype: string
name: disassemble_data
arguments: data_tag: D180
datatype: string
name: disassemble_data
arguments: data_tag: D671
datatype: string
name: disassemble_data
arguments: data_tag: D641
datatype: string

tool: D351: 32

tool: D323: 0

tool: D238: MS

tool: D644: big

tool: D374: #define WITH_TARGET_WORD_BITSIZE %d


tool: D1: #define WITH_TARGET_WORD_MSB %d


tool: D388: #define WITH_HOST_WORD_BITSIZE %d


tool: D317: BIG_ENDIAN

tool: D35: #define WITH_TARGET_BYTE_ORDER %s


tool: D446: #define SIM_BITS_INLINE (ALL_H_INLINE)

tool: D472: #define ASSERT(X) do { if (!(X)) abort(); } while (0)

tool: D422: #include "sim-basics.h"

tool: D455: #define DO_BIT_TESTS

tool: D702: BIT4

tool: D316: BIT5

tool: D12: BIT8

tool: D46: BIT10

tool: D318: BIT16

tool: D367: BIT32

tool: D530: BIT64

tool: D423: BIT

tool: D212: LSBIT8

tool: D105: LSBIT16

tool: D172: LSBIT32

tool: D695: LSBIT64

tool: D33: LSBIT

tool: D469: MSBIT8

tool: D144: MSBIT16

tool: D257: MSBIT32

tool: D131: MSBIT64

tool: D647: MSBIT

tool: D307: test_spec *(bit_tests[]) = {

tool: D225:   &BIT4_test,

tool: D709:   &BIT5_test,

tool: D598:   &BIT8_test,

tool: D629:   &BIT10_test,

tool: D277:   &BIT16_test,

tool: D676:   &BIT32_test,

tool: D451:   &BIT64_test,

tool: D550:   &BIT_test,

tool: D346:   &LSBIT8_test,

tool: D413:   &LSBIT16_test,

tool: D753:   &LSBIT32_test,

tool: D868:   &LSBIT64_test,

tool: D106:   &LSBIT_test,

tool: D860:   &MSBIT8_test,

tool: D15:   &MSBIT16_test,

tool: D794:   &MSBIT32_test,

tool: D867:   &MSBIT64_test,

tool: D109:   &MSBIT_test,

tool: D551:   0,

tool: D471: };


tool: D626: #define DO_MASK_TESTS

tool: D207: MASK8

tool: D600: MASK16

tool: D854: MASK32

tool: D736: MASK64

tool: D478: MASK

tool: D93: test_spec *(mask_tests[]) = {

tool: D273:   &MASK8_test,

tool: D601:   &MASK16_test,

tool: D474:   &MASK32_test,

tool: D407:   &MASK64_test,

tool: D718:   &MASK_test,

tool: D560: 64

tool: D456: 31

tool: D73: 63

tool: D180: LS

tool: D671: little

tool: D641: LITTLE_ENDIAN

assistant: ```c
int main(int argc, char *argv[]) {
  int bitsize;
  int msb;
  char *ms;
  int big_endian;
  if (argc != 4)
    usage(1);
  if (strcmp(argv[1], "32") == 0)
    bitsize = 32;
  else if (strcmp(argv[1], "64") == 0)
    bitsize = 64;
  else
    usage(2);
  if (strcmp(argv[2], "0") == 0)
    msb = 0;
  else if (strcmp(argv[2], "31") == 0 && bitsize == 32)
    msb = 31;
  else if (strcmp(argv[2], "63") == 0 && bitsize == 64)
    msb = 63;
  else
    usage(3);
  if (msb == 0)
    ms = "MS";
  else
    ms = "LS";
  if (strcmp(argv[3], "big") == 0)
    big_endian = 1;
  else if (strcmp(argv[3], "little") == 0)
    big_endian = 0;
  else
    usage(4);
  printf("#define WITH_TARGET_WORD_BITSIZE %d\n", bitsize);
  printf("#define WITH_TARGET_WORD_MSB %d\n", msb);
  printf("#define WITH_HOST_WORD_BITSIZE %d\n", sizeof(int) * 8);
  printf("#define WITH_TARGET_BYTE_ORDER %s\n", big_endian ? "BIG_ENDIAN" : "LITTLE_ENDIAN");
  printf("\n");
  printf("#define SIM_BITS_INLINE (ALL_H_INLINE)\n");
  printf("\n");
  printf("#define ASSERT(X) do { if (!(X)) abort(); } while (0)\n");
  printf("\n");
  printf("#include \"sim-basics.h\"\n");
  gen_struct();
  printf("#define DO_BIT_TESTS\n");
  gen_bit(4, msb, "BIT4", 4);
  gen_bit(5, msb, "BIT5", 5);
  gen_bit(8, msb, "BIT8", 8);
  gen_bit(10, msb, "BIT10", 10);
  gen_bit(16, msb, "BIT16", 16);
  gen_bit(32, msb, "BIT32", 32);
  gen_bit(64, msb, "BIT64", 64);
  gen_bit(bitsize, msb, "BIT", 64);
  gen_bit(8, 8 - 1, "LSBIT8", 8);
  gen_bit(16, 16 - 1, "LSBIT16", 16);
  gen_bit(32, 32 - 1, "LSBIT32", 32);
  gen_bit(64, 64 - 1, "LSBIT64", 64);
  gen_bit(bitsize, bitsize - 1, "LSBIT", 64);
  gen_bit(8, 0, "MSBIT8", 8);
  gen_bit(16, 0, "MSBIT16", 16);
  gen_bit(32, 0, "MSBIT32", 32);
  gen_bit(64, 0, "MSBIT64", 64);
  gen_bit(bitsize, 0, "MSBIT", 64);
  printf("test_spec *(bit_tests[]) = {\n");
  printf("  &BIT4_test,\n");
  printf("  &BIT5_test,\n");
  printf("  &BIT8_test,\n");
  printf("  &BIT10_test,\n");
  printf("  &BIT16_test,\n");
  printf("  &BIT32_test,\n");
  printf("  &BIT64_test,\n");
  printf("  &BIT_test,\n");
  printf("  &LSBIT8_test,\n");
  printf("  &LSBIT16_test,\n");
  printf("  &LSBIT32_test,\n");
  printf("  &LSBIT64_test,\n");
  printf("  &LSBIT_test,\n");
  printf("  &MSBIT8_test,\n");
  printf("  &MSBIT16_test,\n");
  printf("  &MSBIT32_test,\n");
  printf("  &MSBIT64_test,\n");
  printf("  &MSBIT_test,\n");
  printf("  0,\n");
  printf("};\n\n");
  gen_enum("BIT", 64);
  gen_enum("LSBIT", 64);
  gen_enum("MSBIT", 64);
  gen_enum("BIT32", 32);
  gen_enum("LSBIT32", 32);
  gen_enum("MSBIT32", 32);
  printf("#define DO_MASK_TESTS\n");
  gen_mask(8, ms, "MASK8", 8);
  gen_mask(16, ms, "MASK16", 16);
  gen_mask(32, ms, "MASK32", 32);
  gen_mask(64, ms, "MASK64", 64);
  gen_mask(bitsize, ms, "MASK", 64);
  printf("test_spec *(mask_tests[]) = {\n");
  printf("  &MASK8_test,\n");
  printf("  &MASK16_test,\n");
  printf("  &MASK32_test,\n");
  printf("  &MASK64_test,\n");
  printf("  &MASK_test,\n");
  printf("  0,\n");
  printf("};\n\n");
  return 0;
}
```