user: Demonstrate the C code that generates the assembly output below:

```asm
<numstrcmp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
L173:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L93
L192:
  addq   $0x1,-0x10(%rbp)
L93:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L192
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L249
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x18(%rbp)
  jmp    L59
L297:
  addq   $0x1,-0x18(%rbp)
L59:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L297
  jmp    L261
L249:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  addq   $0x1,-0x18(%rbp)
L261:
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  jmp    L106
L25:
  addq   $0x1,-0x8(%rbp)
L106:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L25
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L257
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x20(%rbp)
  jmp    L96
L221:
  addq   $0x1,-0x20(%rbp)
L96:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L221
  jmp    L61
L257:
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x20(%rbp)
L61:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L41
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L103
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jge    L218
  mov    $0xffffffff,%eax
  jmp    L126
L218:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jle    L34
  mov    $0x1,%eax
  jmp    L126
L34:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L173
  mov    $0x0,%eax
  jmp    L126
L103:
  mov    $0x1,%eax
  jmp    L126
L41:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L189
  mov    $0xffffffff,%eax
  jmp    L126
L325:
  addq   $0x1,-0x10(%rbp)
L189:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  je     L325
  jmp    L24
L145:
  addq   $0x1,-0x8(%rbp)
L24:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  je     L145
  mov    -0x18(%rbp),%rax
  sub    -0x10(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  sub    -0x8(%rbp),%rax
  cmp    %rax,%rdx
  jge    L259
  mov    $0xffffffff,%eax
  jmp    L126
L259:
  mov    -0x18(%rbp),%rax
  sub    -0x10(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  sub    -0x8(%rbp),%rax
  cmp    %rax,%rdx
  jle    L203
  mov    $0x1,%eax
  jmp    L126
L4:
  addq   $0x1,-0x10(%rbp)
  addq   $0x1,-0x8(%rbp)
L203:
  mov    -0x10(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jae    L52
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L4
L52:
  mov    -0x10(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jae    L173
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jge    L87
  mov    $0xffffffff,%eax
  jmp    L126
L87:
  mov    $0x1,%eax
L126:
  leave
  ret
```

assistant: ```c
int numstrcmp(char *s1, char *s2) {
  char *a1, *a2;
  while (1) {
    for (a1 = s1; *a1 == ' '; ++a1) {
    }
    if (isdigit(*a1)) {
      for (s1 = a1 + 1; isdigit(*s1); ++s1) {
      }
    } else {
      a1 = s1;
      ++s1;
    }
    for (a2 = s2; *a2 == ' '; ++a2) {
    }
    if (isdigit(*a2)) {
      for (s2 = a2 + 1; isdigit(*s2); ++s2) {
      }
    } else {
      a2 = s2;
      ++s2;
    }
    if (!isdigit(*a1)) {
      if (!isdigit(*a2)) {
        if (*a1 < *a2)
          return -1;
        if (*a1 > *a2)
          return 1;
        if (*a1 == '\0')
          return 0;
      } else
        return 1;
    } else {
      if (!isdigit(*a2))
        return -1;
      else {
        for (; *a1 == '0'; ++a1) {
        }
        for (; *a2 == '0'; ++a2) {
        }
        if (s1 - a1 < s2 - a2)
          return -1;
        if (s1 - a1 > s2 - a2)
          return 1;
        for (; a1 < s1 && *a1 == *a2; ++a1, ++a2) {
        }
        if (a1 < s1) {
          if (*a1 < *a2)
            return -1;
          else
            return 1;
        }
      }
    }
  }
}
```