user: 下面的汇编指令对应的C源代码是什么:

```asm
<strcmp_natural_uncasted>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x2(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1(%rbp)
  jmp    L112
L12:
  nop
  jmp    L52
L22:
  nop
L52:
  movzbl -0x2(%rbp),%eax
  cmp    -0x1(%rbp),%al
  je     L159
  cmpb   $0x60,-0x2(%rbp)
  jle    L82
  cmpb   $0x7a,-0x2(%rbp)
  jg     L82
  movsbl -0x1(%rbp),%eax
  lea    0x20(%rax),%edx
  movsbl -0x2(%rbp),%eax
  cmp    %eax,%edx
  jne    L209
  mov    -0x18(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp_natural_tiebroken@plt>
  neg    %eax
  jmp    L247
L209:
  cmpb   $0x60,-0x1(%rbp)
  jle    L35
  cmpb   $0x7a,-0x1(%rbp)
  jle    L230
L35:
  movzbl -0x2(%rbp),%eax
  sub    $0x20,%eax
  mov    %al,-0x2(%rbp)
  jmp    L230
L82:
  cmpb   $0x60,-0x1(%rbp)
  jle    L224
  cmpb   $0x7a,-0x1(%rbp)
  jg     L224
  movzbl -0x1(%rbp),%eax
  sub    $0x20,%eax
  mov    %al,-0x1(%rbp)
  movzbl -0x2(%rbp),%eax
  cmp    -0x1(%rbp),%al
  jne    L224
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp_natural_tiebroken@plt>
  jmp    L247
L230:
  nop
L224:
  movzbl -0x2(%rbp),%eax
  cmp    -0x1(%rbp),%al
  jge    L34
  mov    $0xffffffff,%eax
  jmp    L247
L34:
  mov    $0x1,%eax
  jmp    L247
L159:
  cmpb   $0x0,-0x2(%rbp)
  jne    L198
  mov    $0x0,%eax
  jmp    L247
L198:
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x2(%rbp)
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1(%rbp)
L112:
  movsbl -0x2(%rbp),%eax
  mov    %eax,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L44
  movsbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  jne    L12
L44:
  movsbl -0x2(%rbp),%eax
  mov    %eax,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  jne    L83
  movsbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L222
L83:
  movzbl -0x2(%rbp),%eax
  cmp    -0x1(%rbp),%al
  jge    L110
  mov    $0xffffffff,%eax
  jmp    L247
L110:
  mov    $0x1,%eax
  jmp    L247
L222:
  movzbl -0x2(%rbp),%eax
  cmp    -0x1(%rbp),%al
  je     L71
  movsbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  je     L337
  movzbl -0x2(%rbp),%eax
  cmp    -0x1(%rbp),%al
  jge    L49
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp_natural_scan_forward@plt>
  jmp    L247
L49:
  mov    -0x18(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp_natural_scan_forward@plt>
  neg    %eax
  jmp    L247
L337:
  mov    $0x1,%eax
  jmp    L247
L71:
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x2(%rbp)
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1(%rbp)
  movsbl -0x2(%rbp),%eax
  mov    %eax,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  jne    L222
  movsbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  je     L22
  mov    $0xffffffff,%eax
L247:
  leave
  ret
```

assistant: ```c
int strcmp_natural_uncasted(const char *s1, const char *s2) {
  char c1 = *s1;
  char c2 = *s2;
  while (is_not_nzdigit(c1) && is_not_nzdigit(c2)) {
  strcmp_natural_uncasted_state_0:
    if (c1 != c2) {
      if ((c1 >= 'a') && (c1 <= 'z')) {
        if (c2 + 32 == c1) {
          return -strcmp_natural_tiebroken(s2, s1);
        } else if ((c2 < 'a') || (c2 > 'z')) {
          c1 -= 32;
        }
      } else if ((c2 >= 'a') && (c2 <= 'z')) {
        c2 -= 32;
        if (c1 == c2) {
          return strcmp_natural_tiebroken(s1, s2);
        }
      }
      return (c1 < c2) ? -1 : 1;
    } else if (!c1) {
      return 0;
    }
    c1 = *(++s1);
    c2 = *(++s2);
  }
  if (is_not_nzdigit(c1) || is_not_nzdigit(c2)) {
    return (c1 < c2) ? -1 : 1;
  }
  do {
    if (c1 != c2) {
      if (is_digit(c2)) {
        if (c1 < c2) {
          return strcmp_natural_scan_forward(s1, s2);
        } else {
          return -strcmp_natural_scan_forward(s2, s1);
        }
      }
      return 1;
    }
    c1 = *(++s1);
    c2 = *(++s2);
  } while (is_digit(c1));
  if (is_digit(c2)) {
    return -1;
  }
  goto strcmp_natural_uncasted_state_0;
}
```