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    L125
  test   %edx,%edx
  je     L125
  test   %rsi,%rsi
  je     L216
  mov    %rdi,(%r12)
L216:
  mov    D31(%rip),%rax
  xor    %r8d,%r8d
  mov    (%rax),%edx
  mov    D3(%rip),%rax
  mov    %edx,(%rax)
L14:
  pop    %rbx
  mov    %r8d,%eax
  pop    %rbp
  pop    %r12
  ret
  nopw   0x0(%rax,%rax,1)
L212:
  add    $0x1,%rbx
L125:
  movsbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L212
  movzbl (%rbx),%edx
  mov    %ebp,%r9d
  test   %ebp,%ebp
  je     L6
L81:
  test   %dl,%dl
  je     L21
  mov    D21(%rip),%rax
  xor    %r8d,%r8d
  movsbl %r9b,%edi
  movsbl (%rax),%r11d
  jmp    L205
  nopl   0x0(%rax,%rax,1)
L237:
  lea    -0x41(%rdx),%eax
  cmp    $0x19,%al
  ja     L178
L44:
  lea    -0x37(%rdx),%ecx
L88:
  cmp    %r9b,%cl
  jge    L178
L229:
  movsbl %cl,%edx
  mov    %r11d,%eax
  movsbl %r8b,%esi
  sub    %edx,%eax
  cltd
  idiv   %edi
  cmp    %eax,%esi
  jg     L142
  mov    %r8d,%eax
  movzbl (%rbx),%edx
  imul   %ebp,%eax
  mov    %eax,%r8d
  add    %ecx,%r8d
  test   %dl,%dl
  je     L32
L205:
  lea    -0x30(%rdx),%eax
  mov    %rbx,%r10
  lea    -0x61(%rdx),%ecx
  add    $0x1,%rbx
  cmp    $0x9,%al
  jbe    L161
  cmp    $0x19,%cl
  ja     L237
  cmp    $0x9,%al
  ja     L137
L161:
  mov    %eax,%ecx
  cmp    %r9b,%cl
  jl     L229
  cs nopw 0x0(%rax,%rax,1)
L178:
  test   %r12,%r12
  je     L14
  pop    %rbx
  mov    %r8d,%eax
  pop    %rbp
  mov    %r10,(%r12)
  pop    %r12
  ret
  nopl   (%rax)
L137:
  cmp    $0x19,%cl
  ja     L44
  lea    -0x57(%rdx),%ecx
  jmp    L88
  nopw   0x0(%rax,%rax,1)
L6:
  mov    $0xa,%r9d
  mov    $0xa,%ebp
  cmp    $0x30,%dl
  jne    L81
  movzbl 0x1(%rbx),%edx
  cmp    $0x78,%dl
  je     L106
  add    $0x1,%rbx
  mov    $0x8,%r9d
  mov    $0x8,%ebp
  jmp    L81
L21:
  xor    %r8d,%r8d
  nopl   0x0(%rax)
L32:
  mov    %rbx,%r10
  jmp    L178
  nopl   (%rax)
L142:
  mov    D37(%rip),%rax
  mov    (%rax),%edx
  mov    D3(%rip),%rax
  mov    %edx,(%rax)
  test   %r12,%r12
  je     L82
  mov    %r10,(%r12)
L82:
  mov    D27(%rip),%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  movzbl (%rax),%r8d
  mov    %r8d,%eax
  ret
L106:
  movzbl 0x2(%rbx),%edx
  mov    $0x10,%r9d
  add    $0x2,%rbx
  mov    $0x10,%ebp
  jmp    L81
```

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;
}
```