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

```asm
<strtoumax>:
  endbr64
  lea    -0x2(%rdx),%eax
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %edx,%ebp
  push   %rbx
  mov    %rdi,%rbx
  cmp    $0x22,%eax
  jbe    L133
  test   %edx,%edx
  je     L133
  test   %rsi,%rsi
  je     L134
  mov    %rdi,(%r12)
L134:
  mov    D48(%rip),%rax
  xor    %r8d,%r8d
  mov    (%rax),%edx
  mov    D36(%rip),%rax
  mov    %edx,(%rax)
L200:
  pop    %rbx
  mov    %r8d,%eax
  pop    %rbp
  pop    %r12
  ret
  nopw   0x0(%rax,%rax,1)
L82:
  add    $0x1,%rbx
L133:
  movsbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L82
  movzbl (%rbx),%edx
  mov    %ebp,%r9d
  test   %ebp,%ebp
  je     L13
L67:
  test   %dl,%dl
  je     L145
  mov    D49(%rip),%rax
  xor    %r8d,%r8d
  movsbl %r9b,%edi
  movsbl (%rax),%r11d
  jmp    L10
  nopl   0x0(%rax,%rax,1)
L177:
  lea    -0x41(%rdx),%eax
  cmp    $0x19,%al
  ja     L68
L56:
  lea    -0x37(%rdx),%ecx
L205:
  cmp    %r9b,%cl
  jge    L68
L120:
  movsbl %cl,%edx
  mov    %r11d,%eax
  movsbl %r8b,%esi
  sub    %edx,%eax
  cltd
  idiv   %edi
  cmp    %eax,%esi
  jg     L88
  mov    %r8d,%eax
  movzbl (%rbx),%edx
  imul   %ebp,%eax
  mov    %eax,%r8d
  add    %ecx,%r8d
  test   %dl,%dl
  je     L15
L10:
  lea    -0x30(%rdx),%ecx
  mov    %rbx,%r10
  lea    -0x61(%rdx),%eax
  add    $0x1,%rbx
  cmp    $0x9,%cl
  jbe    L205
  cmp    $0x19,%al
  ja     L177
  cmp    $0x9,%cl
  jbe    L205
  cmp    $0x19,%al
  ja     L56
  lea    -0x57(%rdx),%ecx
  cmp    %r9b,%cl
  jl     L120
  nopl   0x0(%rax,%rax,1)
L68:
  test   %r12,%r12
  je     L200
  pop    %rbx
  mov    %r8d,%eax
  pop    %rbp
  mov    %r10,(%r12)
  pop    %r12
  ret
  nopl   (%rax)
L13:
  mov    $0xa,%r9d
  mov    $0xa,%ebp
  cmp    $0x30,%dl
  jne    L67
  movzbl 0x1(%rbx),%edx
  cmp    $0x78,%dl
  je     L175
  add    $0x1,%rbx
  mov    $0x8,%r9d
  mov    $0x8,%ebp
  jmp    L67
L145:
  xor    %r8d,%r8d
  nopl   0x0(%rax)
L15:
  mov    %rbx,%r10
  jmp    L68
  nopl   (%rax)
L88:
  mov    D16(%rip),%rax
  mov    (%rax),%edx
  mov    D36(%rip),%rax
  mov    %edx,(%rax)
  test   %r12,%r12
  je     L180
  mov    %r10,(%r12)
L180:
  mov    D21(%rip),%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  movzbl (%rax),%r8d
  mov    %r8d,%eax
  ret
L175:
  movzbl 0x2(%rbx),%edx
  mov    $0x10,%r9d
  add    $0x2,%rbx
  mov    $0x10,%ebp
  jmp    L67
```

assistant: ```c
uintmax_t strtoumax(const char *str, char **str_end, int base) {
  if (((base < 2) || (base > 36)) && (base != 0)) {
    if (str_end != NULL)
      *str_end = (char *)str;
    errno = EINVAL;
    return 0;
  };
  while (isspace(*str))
    str++;
  uintmax_t out = 0;
  if (base == 0) {
    if (*str == '0') {
      str++;
      base = 8;
      if (*str == 'x') {
        str++;
        base = 16;
      };
    } else {
      base = 10;
    };
  };
  uintmax_t llbase = (uintmax_t)base;
  while (*str != 0) {
    char c = *str++;
    if (((c < '0') || (c > '9')) && ((c < 'a') || (c > 'z')) && ((c < 'A') || (c > 'Z'))) {
      str--;
      goto finished;
    };
    uintmax_t digit = 0;
    if ((c >= '0') && (c <= '9')) {
      digit = c - '0';
    } else if ((c >= 'a') && (c <= 'z')) {
      digit = 10 + c - 'a';
    } else {
      digit = 10 + c - 'A';
    };
    if (digit >= llbase) {
      str--;
      goto finished;
    };
    if (out > ((UINTMAX_MAX - digit) / llbase)) {
      str--;
      errno = ERANGE;
      if (str_end != NULL)
        *str_end = (char *)str;
      return ULONG_MAX;
    };
    out = out * llbase + digit;
  };
finished:
  if (str_end != NULL)
    *str_end = (char *)str;
  return out;
}
```