user: 这段汇编代码用C语言表示是什么样的？

```asm
<strnatcmp0>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  test   %rdi,%rdi
  setne  %al
  mov    %rdi,0x8(%rsp)
  xor    %edi,%edi
  test   %rsi,%rsi
  setne  %dil
  mov    %rsi,0x10(%rsp)
  xor    %ebx,%ebx
  and    %eax,%edi
  mov    %edx,0x1c(%rsp)
  call   <assert@plt>
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L85:
  movslq %eax,%r14
  mov    0x8(%rsp),%rax
  movslq %ebx,%rbx
  movzbl (%rax,%r14,1),%ebp
  mov    0x10(%rsp),%rax
  movzbl (%rax,%rbx,1),%r12d
  jmp    L77
  nopl   0x0(%rax)
L120:
  mov    0x8(%rsp),%rax
  movzbl (%rax,%r14,1),%ebp
L77:
  movsbl %bpl,%r13d
  mov    %r14d,%r15d
  add    $0x1,%r14
  mov    %r13d,%edi
  call   <nat_isspace@plt>
  test   %rax,%rax
  jne    L120
  jmp    L159
  nopl   0x0(%rax)
L95:
  mov    0x10(%rsp),%rax
  movzbl (%rax,%rbx,1),%r12d
L159:
  movsbl %r12b,%r14d
  mov    %ebx,0x18(%rsp)
  add    $0x1,%rbx
  mov    %r14d,%edi
  call   <nat_isspace@plt>
  test   %rax,%rax
  jne    L95
  mov    %r13d,%edi
  call   <nat_isdigit@plt>
  test   %rax,%rax
  jne    L46
L40:
  mov    %ebp,%eax
  or     %r12b,%al
  je     L114
L117:
  mov    0x1c(%rsp),%eax
  test   %eax,%eax
  jne    L166
  cmp    %r12b,%bpl
  jl     L162
L130:
  jg     L37
  mov    0x18(%rsp),%ebx
  lea    0x1(%r15),%eax
  add    $0x1,%ebx
  jmp    L85
  nopw   0x0(%rax,%rax,1)
L46:
  mov    %r14d,%edi
  call   <nat_isdigit@plt>
  test   %rax,%rax
  je     L40
  movslq 0x18(%rsp),%rsi
  movslq %r15d,%rdi
  add    0x10(%rsp),%rsi
  add    0x8(%rsp),%rdi
  cmp    $0x30,%bpl
  je     L165
  cmp    $0x30,%r12b
  je     L165
  call   <compare_right@plt>
  test   %eax,%eax
  je     L40
L38:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L166:
  mov    %r13d,%edi
  call   <nat_toupper@plt>
  mov    %r14d,%edi
  mov    %eax,%ebp
  call   <nat_toupper@plt>
  mov    %eax,%r12d
  cmp    %r12b,%bpl
  jge    L130
L162:
  add    $0x28,%rsp
  mov    $0xffffffff,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L165:
  call   <compare_left@plt>
  test   %eax,%eax
  jne    L38
  mov    %ebp,%eax
  or     %r12b,%al
  jne    L117
L114:
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L37:
  add    $0x28,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int strnatcmp0(char const *a, char const *b, int fold_case) {
  int ai, bi;
  char ca, cb;
  int fractional, result;
  assert(a && b);
  ai = bi = 0;
  while (1) {
    ca = a[ai];
    cb = b[bi];
    while (nat_isspace(ca))
      ca = a[++ai];
    while (nat_isspace(cb))
      cb = b[++bi];
    if (nat_isdigit(ca) && nat_isdigit(cb)) {
      fractional = (ca == '0' || cb == '0');
      if (fractional) {
        if ((result = compare_left(a + ai, b + bi)) != 0)
          return result;
      } else {
        if ((result = compare_right(a + ai, b + bi)) != 0)
          return result;
      }
    }
    if (!ca && !cb) {
      return 0;
    }
    if (fold_case) {
      ca = nat_toupper(ca);
      cb = nat_toupper(cb);
    }
    if (ca < cb)
      return -1;
    else if (ca > cb)
      return +1;
    ++ai;
    ++bi;
  }
}
```