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

```asm
<string_strcmp_ignore_chars>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %ecx,-0x2c(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  je     L223
  cmpq   $0x0,-0x20(%rbp)
  jne    L123
L223:
  cmpq   $0x0,-0x18(%rbp)
  jne    L504
  cmpq   $0x0,-0x20(%rbp)
  je     L506
  mov    $0xffffffff,%eax
  jmp    L488
L506:
  mov    $0x0,%eax
  jmp    L488
L504:
  mov    $0x1,%eax
  jmp    L488
L507:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,-0x18(%rbp)
L305:
  cmpq   $0x0,-0x18(%rbp)
  je     L77
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L77
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L507
  jmp    L77
L133:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,-0x20(%rbp)
L77:
  cmpq   $0x0,-0x20(%rbp)
  je     L279
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L279
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L133
L279:
  cmpq   $0x0,-0x18(%rbp)
  je     L427
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L132
L427:
  cmpq   $0x0,-0x20(%rbp)
  je     L154
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L132
L154:
  mov    $0x0,%eax
  jmp    L488
L132:
  cmpq   $0x0,-0x18(%rbp)
  je     L259
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L69
L259:
  cmpq   $0x0,-0x20(%rbp)
  je     L69
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L69
  mov    $0xffffffff,%eax
  jmp    L488
L69:
  cmpq   $0x0,-0x18(%rbp)
  je     L173
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L173
  cmpq   $0x0,-0x20(%rbp)
  je     L480
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L173
L480:
  mov    $0x1,%eax
  jmp    L488
L173:
  cmpl   $0x0,-0x2c(%rbp)
  je     L437
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  jmp    L550
L437:
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <utf8_charcasecmp@plt>
L550:
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  je     L227
  cmpl   $0x0,-0x4(%rbp)
  jns    L440
  mov    $0xffffffff,%eax
  jmp    L488
L440:
  mov    $0x1,%eax
  jmp    L488
L227:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,-0x20(%rbp)
  jmp    L43
L6:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,-0x18(%rbp)
L43:
  cmpq   $0x0,-0x18(%rbp)
  je     L410
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L410
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L6
  jmp    L410
L362:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,-0x20(%rbp)
L410:
  cmpq   $0x0,-0x20(%rbp)
  je     L123
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L123
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L362
L123:
  cmpq   $0x0,-0x18(%rbp)
  je     L108
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L108
  cmpq   $0x0,-0x20(%rbp)
  je     L108
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L305
L108:
  cmpq   $0x0,-0x18(%rbp)
  je     L280
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L557
L280:
  cmpq   $0x0,-0x20(%rbp)
  je     L557
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L557
  mov    $0xffffffff,%eax
  jmp    L488
L557:
  cmpq   $0x0,-0x18(%rbp)
  je     L290
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L290
  cmpq   $0x0,-0x20(%rbp)
  je     L155
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L290
L155:
  mov    $0x1,%eax
  jmp    L488
L290:
  mov    $0x0,%eax
L488:
  leave
  ret
```

assistant: ```c
int string_strcmp_ignore_chars(const char *string1, const char *string2, const char *chars_ignored, int case_sensitive) {
  int diff;
  if (!string1 || !string2)
    return (string1) ? 1 : ((string2) ? -1 : 0);
  while (string1 && string1[0] && string2 && string2[0]) {
    while (string1 && string1[0] && strchr(chars_ignored, string1[0])) {
      string1 = utf8_next_char(string1);
    }
    while (string2 && string2[0] && strchr(chars_ignored, string2[0])) {
      string2 = utf8_next_char(string2);
    }
    if ((!string1 || !string1[0]) && (!string2 || !string2[0]))
      return 0;
    if ((!string1 || !string1[0]) && string2 && string2[0])
      return -1;
    if (string1 && string1[0] && (!string2 || !string2[0]))
      return 1;
    diff = (case_sensitive) ? (int)string1[0] - (int)string2[0] : utf8_charcasecmp(string1, string2);
    if (diff != 0)
      return (diff < 0) ? -1 : 1;
    string1 = utf8_next_char(string1);
    string2 = utf8_next_char(string2);
    while (string1 && string1[0] && strchr(chars_ignored, string1[0])) {
      string1 = utf8_next_char(string1);
    }
    while (string2 && string2[0] && strchr(chars_ignored, string2[0])) {
      string2 = utf8_next_char(string2);
    }
  }
  if ((!string1 || !string1[0]) && string2 && string2[0])
    return -1;
  if (string1 && string1[0] && (!string2 || !string2[0]))
    return 1;
  return 0;
}
```