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     L136
  mov    $0x1,%edi
  call   <usage@plt>
L136:
  mov    0x8(%rbx),%rdi
  lea    D646(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L16
L48:
  mov    0x10(%rbx),%rdi
  lea    D75(%rip),%rsi
  mov    $0x20,%r12d
  xor    %ebp,%ebp
  lea    D635(%rip),%r13
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L123
L0:
  mov    0x18(%rbx),%rdi
  lea    D187(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L56
  mov    %r12d,%esi
  lea    D823(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %ebp,%esi
  lea    D610(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0x20,%esi
  lea    D38(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D801(%rip),%rsi
L52:
  lea    D674(%rip),%rdi
  xor    %eax,%eax
  lea    D515(%rip),%rbx
  call   <printf@plt>
  mov    $0xa,%edi
  lea    D379(%rip),%r15
  lea    D458(%rip),%r14
  call   <putchar@plt>
  lea    D20(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    D810(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  lea    D48(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <gen_struct@plt>
  lea    D814(%rip),%rdi
  call   <puts@plt>
  mov    %ebp,%esi
  mov    $0x4,%ecx
  lea    D461(%rip),%rdx
  mov    $0x4,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0x5,%ecx
  lea    D716(%rip),%rdx
  mov    $0x5,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0x8,%ecx
  lea    D314(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0xa,%ecx
  lea    D796(%rip),%rdx
  mov    $0xa,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    $0x10,%ecx
  lea    D21(%rip),%rdx
  mov    $0x10,%edi
  call   <gen_bit@plt>
  lea    D165(%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    D836(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_bit@plt>
  mov    %ebp,%esi
  mov    %r12d,%edi
  mov    $0x40,%ecx
  lea    D35(%rip),%r10
  lea    D370(%rip),%rbp
  mov    %r10,%rdx
  call   <gen_bit@plt>
  mov    $0x8,%ecx
  mov    $0x7,%esi
  lea    D293(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_bit@plt>
  mov    $0x10,%ecx
  mov    $0xf,%esi
  lea    D225(%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    D162(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_bit@plt>
  lea    D686(%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    D555(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_bit@plt>
  xor    %esi,%esi
  mov    $0x10,%ecx
  lea    D283(%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    D757(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_bit@plt>
  xor    %esi,%esi
  mov    $0x40,%ecx
  mov    %r12d,%edi
  lea    D838(%rip),%r9
  mov    %r9,%rdx
  call   <gen_bit@plt>
  lea    D292(%rip),%rdi
  call   <puts@plt>
  lea    D649(%rip),%rdi
  call   <puts@plt>
  lea    D701(%rip),%rdi
  call   <puts@plt>
  lea    D546(%rip),%rdi
  call   <puts@plt>
  lea    D573(%rip),%rdi
  call   <puts@plt>
  lea    D650(%rip),%rdi
  call   <puts@plt>
  lea    D41(%rip),%rdi
  call   <puts@plt>
  lea    D147(%rip),%rdi
  call   <puts@plt>
  lea    D504(%rip),%rdi
  call   <puts@plt>
  lea    D740(%rip),%rdi
  call   <puts@plt>
  lea    D804(%rip),%rdi
  call   <puts@plt>
  lea    D236(%rip),%rdi
  call   <puts@plt>
  lea    D468(%rip),%rdi
  call   <puts@plt>
  lea    D763(%rip),%rdi
  call   <puts@plt>
  lea    D802(%rip),%rdi
  call   <puts@plt>
  lea    D410(%rip),%rdi
  call   <puts@plt>
  lea    D693(%rip),%rdi
  call   <puts@plt>
  lea    D288(%rip),%rdi
  call   <puts@plt>
  lea    D423(%rip),%rdi
  call   <puts@plt>
  mov    %r14,%rdi
  call   <puts@plt>
  mov    %rbp,%rdi
  call   <puts@plt>
  lea    D35(%rip),%r10
  mov    $0x40,%esi
  mov    %r10,%rdi
  call   <gen_enum@plt>
  lea    D686(%rip),%r11
  mov    $0x40,%esi
  mov    %r11,%rdi
  call   <gen_enum@plt>
  lea    D838(%rip),%r9
  mov    $0x40,%esi
  mov    %r9,%rdi
  call   <gen_enum@plt>
  lea    D165(%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    D629(%rip),%rdi
  call   <puts@plt>
  mov    %r13,%rsi
  mov    $0x8,%ecx
  lea    D484(%rip),%rdx
  mov    $0x8,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x10,%ecx
  lea    D616(%rip),%rdx
  mov    $0x10,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x20,%ecx
  lea    D344(%rip),%rdx
  mov    $0x20,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x40,%ecx
  lea    D16(%rip),%rdx
  mov    $0x40,%edi
  call   <gen_mask@plt>
  mov    %r13,%rsi
  mov    $0x40,%ecx
  mov    %r12d,%edi
  lea    D590(%rip),%rdx
  call   <gen_mask@plt>
  lea    D767(%rip),%rdi
  call   <puts@plt>
  lea    D15(%rip),%rdi
  call   <puts@plt>
  lea    D766(%rip),%rdi
  call   <puts@plt>
  lea    D274(%rip),%rdi
  call   <puts@plt>
  lea    D743(%rip),%rdi
  call   <puts@plt>
  lea    D467(%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
L16:
  mov    0x8(%rbx),%rdi
  lea    D751(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L34
  mov    0x10(%rbx),%rdi
  lea    D75(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L30
  mov    $0x40,%r12d
  xor    %ebp,%ebp
  lea    D635(%rip),%r13
  jmp    L0
L56:
  mov    0x18(%rbx),%rdi
  lea    D497(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L129
  mov    $0x4,%edi
  call   <usage@plt>
L129:
  mov    %r12d,%esi
  lea    D823(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %ebp,%esi
  lea    D610(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0x20,%esi
  lea    D38(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D541(%rip),%rsi
  jmp    L52
L123:
  mov    0x10(%rbx),%rdi
  lea    D243(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L62
  mov    0x10(%rbx),%rdi
  lea    D300(%rip),%rsi
  call   <strcmp@plt>
L15:
  mov    $0x3,%edi
  lea    D635(%rip),%r13
  call   <usage@plt>
  test   %ebp,%ebp
  lea    D658(%rip),%rax
  cmovne %rax,%r13
  jmp    L0
L62:
  mov    $0x1f,%ebp
  lea    D658(%rip),%r13
  jmp    L0
L30:
  mov    0x10(%rbx),%rdi
  lea    D243(%rip),%rsi
  mov    $0x40,%r12d
  call   <strcmp@plt>
  mov    0x10(%rbx),%rdi
  lea    D300(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L15
  mov    $0x3f,%ebp
  lea    D658(%rip),%r13
  jmp    L0
L34:
  mov    $0x2,%edi
  call   <usage@plt>
  jmp    L48
```

tool_calls: name: disassemble_data
arguments: label: D646
datatype: string
name: disassemble_data
arguments: label: D75
datatype: string
name: disassemble_data
arguments: label: D635
datatype: string
name: disassemble_data
arguments: label: D187
datatype: string
name: disassemble_data
arguments: label: D823
datatype: string
name: disassemble_data
arguments: label: D610
datatype: string
name: disassemble_data
arguments: label: D38
datatype: string
name: disassemble_data
arguments: label: D801
datatype: string
name: disassemble_data
arguments: label: D674
datatype: string
name: disassemble_data
arguments: label: D515
datatype: string
name: disassemble_data
arguments: label: D379
datatype: string
name: disassemble_data
arguments: label: D458
datatype: string
name: disassemble_data
arguments: label: D20
datatype: string
name: disassemble_data
arguments: label: D810
datatype: string
name: disassemble_data
arguments: label: D48
datatype: string
name: disassemble_data
arguments: label: D814
datatype: string
name: disassemble_data
arguments: label: D461
datatype: string
name: disassemble_data
arguments: label: D716
datatype: string
name: disassemble_data
arguments: label: D314
datatype: string
name: disassemble_data
arguments: label: D796
datatype: string
name: disassemble_data
arguments: label: D21
datatype: string
name: disassemble_data
arguments: label: D165
datatype: string
name: disassemble_data
arguments: label: D836
datatype: string
name: disassemble_data
arguments: label: D35
datatype: string
name: disassemble_data
arguments: label: D370
datatype: string
name: disassemble_data
arguments: label: D293
datatype: string
name: disassemble_data
arguments: label: D225
datatype: string
name: disassemble_data
arguments: label: D162
datatype: string
name: disassemble_data
arguments: label: D686
datatype: string
name: disassemble_data
arguments: label: D555
datatype: string
name: disassemble_data
arguments: label: D283
datatype: string
name: disassemble_data
arguments: label: D757
datatype: string
name: disassemble_data
arguments: label: D838
datatype: string
name: disassemble_data
arguments: label: D292
datatype: string
name: disassemble_data
arguments: label: D649
datatype: string
name: disassemble_data
arguments: label: D701
datatype: string
name: disassemble_data
arguments: label: D546
datatype: string
name: disassemble_data
arguments: label: D573
datatype: string
name: disassemble_data
arguments: label: D650
datatype: string
name: disassemble_data
arguments: label: D41
datatype: string
name: disassemble_data
arguments: label: D147
datatype: string
name: disassemble_data
arguments: label: D504
datatype: string
name: disassemble_data
arguments: label: D740
datatype: string
name: disassemble_data
arguments: label: D804
datatype: string
name: disassemble_data
arguments: label: D236
datatype: string
name: disassemble_data
arguments: label: D468
datatype: string
name: disassemble_data
arguments: label: D763
datatype: string
name: disassemble_data
arguments: label: D802
datatype: string
name: disassemble_data
arguments: label: D410
datatype: string
name: disassemble_data
arguments: label: D693
datatype: string
name: disassemble_data
arguments: label: D288
datatype: string
name: disassemble_data
arguments: label: D423
datatype: string
name: disassemble_data
arguments: label: D629
datatype: string
name: disassemble_data
arguments: label: D484
datatype: string
name: disassemble_data
arguments: label: D616
datatype: string
name: disassemble_data
arguments: label: D344
datatype: string
name: disassemble_data
arguments: label: D16
datatype: string
name: disassemble_data
arguments: label: D590
datatype: string
name: disassemble_data
arguments: label: D767
datatype: string
name: disassemble_data
arguments: label: D15
datatype: string
name: disassemble_data
arguments: label: D766
datatype: string
name: disassemble_data
arguments: label: D274
datatype: string
name: disassemble_data
arguments: label: D743
datatype: string
name: disassemble_data
arguments: label: D467
datatype: string
name: disassemble_data
arguments: label: D751
datatype: string
name: disassemble_data
arguments: label: D497
datatype: string
name: disassemble_data
arguments: label: D541
datatype: string
name: disassemble_data
arguments: label: D243
datatype: string
name: disassemble_data
arguments: label: D300
datatype: string
name: disassemble_data
arguments: label: D658
datatype: string

tool: D646: 32

tool: D75: 0

tool: D635: MS

tool: D187: big

tool: D823: #define WITH_TARGET_WORD_BITSIZE %d


tool: D610: #define WITH_TARGET_WORD_MSB %d


tool: D38: #define WITH_HOST_WORD_BITSIZE %d


tool: D801: BIG_ENDIAN

tool: D674: #define WITH_TARGET_BYTE_ORDER %s


tool: D515: LSBIT32

tool: D379: MSBIT32

tool: D458:   0,

tool: D20: #define SIM_BITS_INLINE (ALL_H_INLINE)

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

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

tool: D814: #define DO_BIT_TESTS

tool: D461: BIT4

tool: D716: BIT5

tool: D314: BIT8

tool: D796: BIT10

tool: D21: BIT16

tool: D165: BIT32

tool: D836: BIT64

tool: D35: BIT

tool: D370: };


tool: D293: LSBIT8

tool: D225: LSBIT16

tool: D162: LSBIT64

tool: D686: LSBIT

tool: D555: MSBIT8

tool: D283: MSBIT16

tool: D757: MSBIT64

tool: D838: MSBIT

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

tool: D649:   &BIT4_test,

tool: D701:   &BIT5_test,

tool: D546:   &BIT8_test,

tool: D573:   &BIT10_test,

tool: D650:   &BIT16_test,

tool: D41:   &BIT32_test,

tool: D147:   &BIT64_test,

tool: D504:   &BIT_test,

tool: D740:   &LSBIT8_test,

tool: D804:   &LSBIT16_test,

tool: D236:   &LSBIT32_test,

tool: D468:   &LSBIT64_test,

tool: D763:   &LSBIT_test,

tool: D802:   &MSBIT8_test,

tool: D410:   &MSBIT16_test,

tool: D693:   &MSBIT32_test,

tool: D288:   &MSBIT64_test,

tool: D423:   &MSBIT_test,

tool: D629: #define DO_MASK_TESTS

tool: D484: MASK8

tool: D616: MASK16

tool: D344: MASK32

tool: D16: MASK64

tool: D590: MASK

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

tool: D15:   &MASK8_test,

tool: D766:   &MASK16_test,

tool: D274:   &MASK32_test,

tool: D743:   &MASK64_test,

tool: D467:   &MASK_test,

tool: D751: 64

tool: D497: little

tool: D541: LITTLE_ENDIAN

tool: D243: 31

tool: D300: 63

tool: D658: 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;
}
```