user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x8,%rsp
  cmp    $0x4,%edi
  je     L112
  mov    $0x1,%edi
  call   <usage@plt>
L112:
  mov    0x8(%rbx),%rdi
  lea    D631(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L84
L123:
  mov    0x10(%rbx),%rdi
  lea    D751(%rip),%rsi
  mov    $0x20,%r12d
  xor    %ebp,%ebp
  lea    D416(%rip),%r13
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L142
L92:
  mov    0x18(%rbx),%rdi
  lea    D734(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L128
  mov    %r12d,%esi
  lea    D706(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %ebp,%esi
  lea    D639(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0x20,%esi
  lea    D642(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D404(%rip),%rsi
L94:
  lea    D447(%rip),%rdi
  xor    %eax,%eax
  lea    D294(%rip),%rbx
  call   <printf@plt>
  mov    $0xa,%edi
  lea    D633(%rip),%r15
  lea    D275(%rip),%r14
  call   <putchar@plt>
  lea    D619(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    D407(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    D373(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <gen_struct@plt>
  lea    D529(%rip),%rdi
  call   <puts@plt>
  mov    %ebp,%esi
  mov    $0x4,%ecx
  lea    D492(%rip),%rdx
  mov    $0x4,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0x5,%ecx
  lea    D336(%rip),%rdx
  mov    $0x5,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0x8,%ecx
  lea    D700(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0xa,%ecx
  lea    D90(%rip),%rdx
  mov    $0xa,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0x10,%ecx
  lea    D746(%rip),%rdx
  mov    $0x10,%edi
  call   <gen_bit@plt>
  lea    D359(%rip),%r8
  mov    %ebp,%esi
  mov    $0x20,%ecx
  mov    %r8,%rdx
  mov    $0x20,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0x40,%ecx
  lea    D787(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    %r12d,%edi
  mov    $0x40,%ecx
  lea    D82(%rip),%r10
  lea    D532(%rip),%rbp
  mov    %r10,%rdx
  call   <gen_bit@plt>
  mov    $0x8,%ecx
  mov    $0x7,%esi
  lea    D43(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_bit@plt>
  mov    $0x10,%ecx
  mov    $0xf,%esi
  lea    D536(%rip),%rdx
  mov    $0x10,%edi
  call   <gen_bit@plt>
  mov    %rbx,%rdx
  mov    $0x20,%ecx
  mov    $0x1f,%esi
  mov    $0x20,%edi
  call   <gen_bit@plt>
  mov    $0x40,%ecx
  mov    $0x3f,%esi
  lea    D538(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_bit@plt>
  lea    D614(%rip),%r11
  lea    -0x1(%r12),%esi
  mov    %r12d,%edi
  mov    %r11,%rdx
  mov    $0x40,%ecx
  call   <gen_bit@plt>
  xor    %esi,%esi
  mov    $0x8,%ecx
  lea    D729(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_bit@plt>
  xor    %esi,%esi
  mov    $0x10,%ecx
  lea    D475(%rip),%rdx
  mov    $0x10,%edi
  call   <gen_bit@plt>
  mov    %r15,%rdx
  xor    %esi,%esi
  mov    $0x20,%ecx
  mov    $0x20,%edi
  call   <gen_bit@plt>
  mov    $0x40,%ecx
  xor    %esi,%esi
  lea    D467(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_bit@plt>
  xor    %esi,%esi
  mov    $0x40,%ecx
  mov    %r12d,%edi
  lea    D290(%rip),%r9
  mov    %r9,%rdx
  call   <gen_bit@plt>
  lea    D534(%rip),%rdi
  call   <puts@plt>
  lea    D395(%rip),%rdi
  call   <puts@plt>
  lea    D396(%rip),%rdi
  call   <puts@plt>
  lea    D227(%rip),%rdi
  call   <puts@plt>
  lea    D812(%rip),%rdi
  call   <puts@plt>
  lea    D10(%rip),%rdi
  call   <puts@plt>
  lea    D785(%rip),%rdi
  call   <puts@plt>
  lea    D342(%rip),%rdi
  call   <puts@plt>
  lea    D209(%rip),%rdi
  call   <puts@plt>
  lea    D731(%rip),%rdi
  call   <puts@plt>
  lea    D383(%rip),%rdi
  call   <puts@plt>
  lea    D364(%rip),%rdi
  call   <puts@plt>
  lea    D256(%rip),%rdi
  call   <puts@plt>
  lea    D503(%rip),%rdi
  call   <puts@plt>
  lea    D255(%rip),%rdi
  call   <puts@plt>
  lea    D380(%rip),%rdi
  call   <puts@plt>
  lea    D228(%rip),%rdi
  call   <puts@plt>
  lea    D295(%rip),%rdi
  call   <puts@plt>
  lea    D378(%rip),%rdi
  call   <puts@plt>
  mov    %r14,%rdi
  call   <puts@plt>
  mov    %rbp,%rdi
  call   <puts@plt>
  lea    D82(%rip),%r10
  mov    $0x40,%esi
  mov    %r10,%rdi
  call   <gen_enum@plt>
  lea    D614(%rip),%r11
  mov    $0x40,%esi
  mov    %r11,%rdi
  call   <gen_enum@plt>
  lea    D290(%rip),%r9
  mov    $0x40,%esi
  mov    %r9,%rdi
  call   <gen_enum@plt>
  lea    D359(%rip),%r8
  mov    $0x20,%esi
  mov    %r8,%rdi
  call   <gen_enum@plt>
  mov    %rbx,%rdi
  mov    $0x20,%esi
  call   <gen_enum@plt>
  mov    $0x20,%esi
  mov    %r15,%rdi
  call   <gen_enum@plt>
  lea    D733(%rip),%rdi
  call   <puts@plt>
  mov    %r13,%rsi
  mov    $0x8,%ecx
  lea    D207(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x10,%ecx
  lea    D671(%rip),%rdx
  mov    $0x10,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x20,%ecx
  lea    D771(%rip),%rdx
  mov    $0x20,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x40,%ecx
  lea    D517(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x40,%ecx
  mov    %r12d,%edi
  lea    D636(%rip),%rdx
  call   <gen_mask@plt>
  lea    D265(%rip),%rdi
  call   <puts@plt>
  lea    D91(%rip),%rdi
  call   <puts@plt>
  lea    D622(%rip),%rdi
  call   <puts@plt>
  lea    D480(%rip),%rdi
  call   <puts@plt>
  lea    D803(%rip),%rdi
  call   <puts@plt>
  lea    D798(%rip),%rdi
  call   <puts@plt>
  mov    %r14,%rdi
  call   <puts@plt>
  mov    %rbp,%rdi
  call   <puts@plt>
  add    $0x8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L84:
  mov    0x8(%rbx),%rdi
  lea    D399(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L52
  mov    0x10(%rbx),%rdi
  lea    D751(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L145
  mov    $0x40,%r12d
  xor    %ebp,%ebp
  lea    D416(%rip),%r13
  jmp    L92
L128:
  mov    0x18(%rbx),%rdi
  lea    D520(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L31
  mov    $0x4,%edi
  call   <usage@plt>
L31:
  mov    %r12d,%esi
  lea    D706(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %ebp,%esi
  lea    D639(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0x20,%esi
  lea    D642(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D752(%rip),%rsi
  jmp    L94
L142:
  mov    0x10(%rbx),%rdi
  lea    D644(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L10
  mov    0x10(%rbx),%rdi
  lea    D237(%rip),%rsi
  call   <strcmp@plt>
L77:
  mov    $0x3,%edi
  lea    D416(%rip),%r13
  call   <usage@plt>
  test   %ebp,%ebp
  lea    D462(%rip),%rax
  cmovne %rax,%r13
  jmp    L92
L10:
  mov    $0x1f,%ebp
  lea    D462(%rip),%r13
  jmp    L92
L145:
  mov    0x10(%rbx),%rdi
  lea    D644(%rip),%rsi
  mov    $0x40,%r12d
  call   <strcmp@plt>
  mov    0x10(%rbx),%rdi
  lea    D237(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L77
  mov    $0x3f,%ebp
  lea    D462(%rip),%r13
  jmp    L92
L52:
  mov    $0x2,%edi
  call   <usage@plt>
  jmp    L123
```

tool_calls: name: parse_data
arguments: tag: D631
type_infered: string
name: parse_data
arguments: tag: D751
type_infered: string
name: parse_data
arguments: tag: D416
type_infered: string
name: parse_data
arguments: tag: D734
type_infered: string
name: parse_data
arguments: tag: D706
type_infered: string
name: parse_data
arguments: tag: D639
type_infered: string
name: parse_data
arguments: tag: D642
type_infered: string
name: parse_data
arguments: tag: D404
type_infered: string
name: parse_data
arguments: tag: D447
type_infered: string
name: parse_data
arguments: tag: D294
type_infered: string
name: parse_data
arguments: tag: D633
type_infered: string
name: parse_data
arguments: tag: D275
type_infered: string
name: parse_data
arguments: tag: D619
type_infered: string
name: parse_data
arguments: tag: D407
type_infered: string
name: parse_data
arguments: tag: D373
type_infered: string
name: parse_data
arguments: tag: D529
type_infered: string
name: parse_data
arguments: tag: D492
type_infered: string
name: parse_data
arguments: tag: D336
type_infered: string
name: parse_data
arguments: tag: D700
type_infered: string
name: parse_data
arguments: tag: D90
type_infered: string
name: parse_data
arguments: tag: D746
type_infered: string
name: parse_data
arguments: tag: D359
type_infered: string
name: parse_data
arguments: tag: D787
type_infered: string
name: parse_data
arguments: tag: D82
type_infered: string
name: parse_data
arguments: tag: D532
type_infered: string
name: parse_data
arguments: tag: D43
type_infered: string
name: parse_data
arguments: tag: D536
type_infered: string
name: parse_data
arguments: tag: D538
type_infered: string
name: parse_data
arguments: tag: D614
type_infered: string
name: parse_data
arguments: tag: D729
type_infered: string
name: parse_data
arguments: tag: D475
type_infered: string
name: parse_data
arguments: tag: D467
type_infered: string
name: parse_data
arguments: tag: D290
type_infered: string
name: parse_data
arguments: tag: D534
type_infered: string
name: parse_data
arguments: tag: D395
type_infered: string
name: parse_data
arguments: tag: D396
type_infered: string
name: parse_data
arguments: tag: D227
type_infered: string
name: parse_data
arguments: tag: D812
type_infered: string
name: parse_data
arguments: tag: D10
type_infered: string
name: parse_data
arguments: tag: D785
type_infered: string
name: parse_data
arguments: tag: D342
type_infered: string
name: parse_data
arguments: tag: D209
type_infered: string
name: parse_data
arguments: tag: D731
type_infered: string
name: parse_data
arguments: tag: D383
type_infered: string
name: parse_data
arguments: tag: D364
type_infered: string
name: parse_data
arguments: tag: D256
type_infered: string
name: parse_data
arguments: tag: D503
type_infered: string
name: parse_data
arguments: tag: D255
type_infered: string
name: parse_data
arguments: tag: D380
type_infered: string
name: parse_data
arguments: tag: D228
type_infered: string
name: parse_data
arguments: tag: D295
type_infered: string
name: parse_data
arguments: tag: D378
type_infered: string
name: parse_data
arguments: tag: D733
type_infered: string
name: parse_data
arguments: tag: D207
type_infered: string
name: parse_data
arguments: tag: D671
type_infered: string
name: parse_data
arguments: tag: D771
type_infered: string
name: parse_data
arguments: tag: D517
type_infered: string
name: parse_data
arguments: tag: D636
type_infered: string
name: parse_data
arguments: tag: D265
type_infered: string
name: parse_data
arguments: tag: D91
type_infered: string
name: parse_data
arguments: tag: D622
type_infered: string
name: parse_data
arguments: tag: D480
type_infered: string
name: parse_data
arguments: tag: D803
type_infered: string
name: parse_data
arguments: tag: D798
type_infered: string
name: parse_data
arguments: tag: D399
type_infered: string
name: parse_data
arguments: tag: D520
type_infered: string
name: parse_data
arguments: tag: D752
type_infered: string
name: parse_data
arguments: tag: D644
type_infered: string
name: parse_data
arguments: tag: D237
type_infered: string
name: parse_data
arguments: tag: D462
type_infered: string

tool: D631: 32

tool: D751: 0

tool: D416: MS

tool: D734: big

tool: D706: #define WITH_TARGET_WORD_BITSIZE %d


tool: D639: #define WITH_TARGET_WORD_MSB %d


tool: D642: #define WITH_HOST_WORD_BITSIZE %d


tool: D404: BIG_ENDIAN

tool: D447: #define WITH_TARGET_BYTE_ORDER %s


tool: D294: LSBIT32

tool: D633: MSBIT32

tool: D275:   0,

tool: D619: #define SIM_BITS_INLINE (ALL_H_INLINE)

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

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

tool: D529: #define DO_BIT_TESTS

tool: D492: BIT4

tool: D336: BIT5

tool: D700: BIT8

tool: D90: BIT10

tool: D746: BIT16

tool: D359: BIT32

tool: D787: BIT64

tool: D82: BIT

tool: D532: };


tool: D43: LSBIT8

tool: D536: LSBIT16

tool: D538: LSBIT64

tool: D614: LSBIT

tool: D729: MSBIT8

tool: D475: MSBIT16

tool: D467: MSBIT64

tool: D290: MSBIT

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

tool: D395:   &BIT4_test,

tool: D396:   &BIT5_test,

tool: D227:   &BIT8_test,

tool: D812:   &BIT10_test,

tool: D10:   &BIT16_test,

tool: D785:   &BIT32_test,

tool: D342:   &BIT64_test,

tool: D209:   &BIT_test,

tool: D731:   &LSBIT8_test,

tool: D383:   &LSBIT16_test,

tool: D364:   &LSBIT32_test,

tool: D256:   &LSBIT64_test,

tool: D503:   &LSBIT_test,

tool: D255:   &MSBIT8_test,

tool: D380:   &MSBIT16_test,

tool: D228:   &MSBIT32_test,

tool: D295:   &MSBIT64_test,

tool: D378:   &MSBIT_test,

tool: D733: #define DO_MASK_TESTS

tool: D207: MASK8

tool: D671: MASK16

tool: D771: MASK32

tool: D517: MASK64

tool: D636: MASK

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

tool: D91:   &MASK8_test,

tool: D622:   &MASK16_test,

tool: D480:   &MASK32_test,

tool: D803:   &MASK64_test,

tool: D798:   &MASK_test,

tool: D399: 64

tool: D520: little

tool: D752: LITTLE_ENDIAN

tool: D644: 31

tool: D237: 63

tool: D462: LS

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;
}
```