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

```asm
<alphanum_cmp>:
  endbr64
  push   %r14
  push   %r13
  movsbl (%rsi),%r13d
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  push   %rbx
  movsbl (%rdi),%edi
  test   %dil,%dil
  je     L100
  mov    %rsi,%rbx
  xor    %eax,%eax
L146:
  test   %r13b,%r13b
  je     L218
  test   %eax,%eax
  je     L201
  xor    %ebp,%ebp
  jmp    L0
  nopl   0x0(%rax)
L157:
  movsbq (%r12),%rax
  movsbl 0x1(%r12),%edi
  lea    0x0(%rbp,%rbp,4),%rdx
  add    $0x1,%r12
  lea    -0x30(%rax,%rdx,2),%rbp
  test   %dil,%dil
  je     L168
L0:
  call   <alphanum_isdigit@plt>
  test   %eax,%eax
  jne    L157
L168:
  movsbl (%rbx),%edi
  test   %dil,%dil
  je     L72
  xor    %r13d,%r13d
  jmp    L182
  nopl   0x0(%rax)
L55:
  movsbq (%rbx),%rax
  movsbl 0x1(%rbx),%edi
  lea    0x0(%r13,%r13,4),%rdx
  add    $0x1,%rbx
  lea    -0x30(%rax,%rdx,2),%r13
  test   %dil,%dil
  je     L166
L182:
  call   <alphanum_isdigit@plt>
  test   %eax,%eax
  jne    L55
L166:
  sub    %r13,%rbp
L72:
  test   %rbp,%rbp
  jne    L37
  movsbl (%r12),%edi
  movsbl (%rbx),%r13d
  xor    %eax,%eax
L165:
  test   %dil,%dil
  jne    L146
  nopl   0x0(%rax)
L100:
  test   %r13b,%r13b
  jne    L125
  xor    %eax,%eax
L118:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L13:
  test   %eax,%eax
  jne    L218
  mov    %ebp,%edi
  call   <toupper@plt>
  mov    %r13d,%edi
  mov    %eax,%ebp
  call   <toupper@plt>
  movsbl %al,%edx
  movsbl %bpl,%eax
  sub    %edx,%eax
  jne    L118
  movzbl 0x1(%r12),%edi
  add    $0x1,%r12
  add    $0x1,%rbx
  movsbl (%rbx),%r13d
  test   %dil,%dil
  je     L100
  test   %r13b,%r13b
  je     L218
L201:
  movsbl %dil,%ebp
  mov    %ebp,%edi
  call   <alphanum_isdigit@plt>
  mov    %r13d,%edi
  mov    %eax,%r14d
  call   <alphanum_isdigit@plt>
  test   %r14d,%r14d
  je     L13
  test   %eax,%eax
  jne    L83
  test   %r14d,%r14d
  je     L13
L125:
  pop    %rbx
  mov    $0xffffffff,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  xchg   %ax,%ax
L218:
  pop    %rbx
  mov    $0x1,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  xchg   %ax,%ax
L83:
  movsbl (%r12),%edi
  movsbl (%rbx),%r13d
  mov    $0x1,%eax
  jmp    L165
L37:
  mov    %ebp,%eax
  jmp    L118
```

assistant: ```c
int alphanum_cmp(const char *l, const char *r) {
  enum mode_t { STRING, NUMBER } mode = STRING;
  while (*l && *r) {
    if (mode == STRING) {
      char l_char, r_char;
      while ((l_char = *l) && (r_char = *r)) {
        const int l_digit = alphanum_isdigit(l_char);
        const int r_digit = alphanum_isdigit(r_char);
        if (l_digit && r_digit) {
          mode = NUMBER;
          break;
        }
        if (l_digit)
          return -1;
        if (r_digit)
          return +1;
        l_char = toupper(l_char);
        r_char = toupper(r_char);
        const int diff = l_char - r_char;
        if (diff != 0)
          return diff;
        ++l;
        ++r;
      }
    } else {
      unsigned long l_int = 0;
      while (*l && alphanum_isdigit(*l)) {
        l_int = l_int * 10 + *l - '0';
        ++l;
      }
      unsigned long r_int = 0;
      while (*r && alphanum_isdigit(*r)) {
        r_int = r_int * 10 + *r - '0';
        ++r;
      }
      const long diff = l_int - r_int;
      if (diff != 0)
        return diff;
      mode = STRING;
    }
  }
  if (*r)
    return -1;
  if (*l)
    return +1;
  return 0;
}
```