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

```asm
<test_enumerate>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  je     L71
  mov    -0x20(%rbp),%rax
  jmp    L145
L71:
  lea    D186(%rip),%rax
L145:
  mov    %rax,%rsi
  lea    D21(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L66
  mov    $0xffffffff,%eax
  jmp    L122
L66:
  mov    -0x20(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <test_enumerate_print_list@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L94
  mov    $0xffffffff,%eax
  jmp    L122
L94:
  mov    -0x8(%rbp),%rax
  lea    D177(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  lea    D218(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D156(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D218(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D156(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D218(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D156(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D156(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D218(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  lea    D218(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <test_enumerate_print_list@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D185(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L90
  mov    $0xffffffff,%eax
  jmp    L122
L90:
  mov    -0x8(%rbp),%rax
  lea    D195(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_is_initialized@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <test_enumerate_print_list@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L98
  mov    $0xffffffff,%eax
  jmp    L122
L98:
  mov    -0x8(%rbp),%rax
  lea    D195(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_nomatch_subsystem@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <test_enumerate_print_list@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D84(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L4
  mov    $0xffffffff,%eax
  jmp    L122
L4:
  mov    -0x8(%rbp),%rax
  lea    D37(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    -0x8(%rbp),%rax
  lea    D61(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    -0x8(%rbp),%rax
  lea    D154(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <test_enumerate_print_list@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D125(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L87
  mov    $0xffffffff,%eax
  jmp    L122
L87:
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_subsystems@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <test_enumerate_print_list@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D132(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L127
  mov    $0xffffffff,%eax
  jmp    L122
L127:
  mov    -0x8(%rbp),%rax
  lea    D212(%rip),%rdx
  lea    D77(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_property@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <test_enumerate_print_list@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_enumerate_unref@plt>
  mov    $0x0,%eax
L122:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D186
type_infered: string
name: disassemble_data
arguments: data_label: D21
type_infered: string
name: disassemble_data
arguments: data_label: D76
type_infered: string
name: disassemble_data
arguments: data_label: D177
type_infered: string
name: disassemble_data
arguments: data_label: D218
type_infered: string
name: disassemble_data
arguments: data_label: D156
type_infered: string
name: disassemble_data
arguments: data_label: D185
type_infered: string
name: disassemble_data
arguments: data_label: D195
type_infered: string
name: disassemble_data
arguments: data_label: D64
type_infered: string
name: disassemble_data
arguments: data_label: D84
type_infered: string
name: disassemble_data
arguments: data_label: D37
type_infered: string
name: disassemble_data
arguments: data_label: D61
type_infered: string
name: disassemble_data
arguments: data_label: D154
type_infered: string
name: disassemble_data
arguments: data_label: D125
type_infered: string
name: disassemble_data
arguments: data_label: D132
type_infered: string
name: disassemble_data
arguments: data_label: D212
type_infered: string
name: disassemble_data
arguments: data_label: D77
type_infered: string

tool: D186: <all>

tool: D21: enumerate '%s'


tool: D76: enumerate 'net' + duplicated scan + null + zero

tool: D177: net

tool: D218: /sys/class/mem/zero

tool: D156: /sys/class/mem/null

tool: D185: enumerate 'block'

tool: D195: block

tool: D64: enumerate 'not block'

tool: D84: enumerate 'pci, mem, vc'

tool: D37: pci

tool: D61: mem

tool: D154: vc

tool: D125: enumerate 'subsystem'

tool: D132: enumerate 'property IF_FS_*=filesystem'

tool: D212: filesystem

tool: D77: ID_FS*

assistant: ```c
int test_enumerate(struct udev *udev, const char *subsystem) {
  struct udev_enumerate *udev_enumerate;
  printf("enumerate '%s'\n", subsystem == NULL ? "<all>" : subsystem);
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, subsystem);
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'net' + duplicated scan + null + zero\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, "net");
  udev_enumerate_scan_devices(udev_enumerate);
  udev_enumerate_scan_devices(udev_enumerate);
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'block'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, "block");
  udev_enumerate_add_match_is_initialized(udev_enumerate);
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'not block'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_nomatch_subsystem(udev_enumerate, "block");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'pci, mem, vc'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, "pci");
  udev_enumerate_add_match_subsystem(udev_enumerate, "mem");
  udev_enumerate_add_match_subsystem(udev_enumerate, "vc");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'subsystem'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_scan_subsystems(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'property IF_FS_*=filesystem'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_property(udev_enumerate, "ID_FS*", "filesystem");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  return 0;
}
```