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

```asm
<stok>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  movzbl (%rdi),%edi
  mov    $0x0,%r12d
  test   %dil,%dil
  jne    L233
L63:
  test   %rbp,%rbp
  je     L31
  mov    %rbx,0x0(%rbp)
L31:
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L233:
  movsbl %dil,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L160
L12:
  add    $0x1,%rbx
  movsbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L12
  mov    $0x1,%r12d
  jmp    L63
L160:
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L79
  cmpb   $0x30,(%rbx)
  je     L333
L345:
  add    $0x1,%rbx
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L345
L62:
  mov    $0x2,%r12d
  cmpb   $0x2e,(%rbx)
  je     L44
L261:
  movzbl (%rbx),%eax
  and    $0xffffffdf,%eax
  cmp    $0x45,%al
  jne    L63
  movzbl 0x1(%rbx),%eax
  sub    $0x2b,%eax
  and    $0xfffffffd,%eax
  cmp    $0x1,%al
  mov    %rbx,%rax
  adc    $0x0,%rax
  lea    0x1(%rax),%rbx
  movsbl 0x1(%rax),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L338
L174:
  add    $0x1,%rbx
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L174
  jmp    L63
L333:
  movzbl 0x1(%rbx),%eax
  and    $0xffffffdf,%eax
  cmp    $0x58,%al
  jne    L345
  add    $0x1,%rbx
L107:
  add    $0x1,%rbx
  movsbl (%rbx),%edi
  call   <isxdigit@plt>
  test   %rax,%rax
  jne    L107
  mov    $0x2,%r12d
  jmp    L63
L44:
  add    $0x1,%rbx
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L44
  mov    $0x3,%r12d
  jmp    L261
L79:
  cmpb   $0x2e,(%rbx)
  je     L65
L326:
  movzbl (%rbx),%ecx
  cmp    $0x27,%cl
  je     L195
  cmp    $0x22,%cl
  je     L195
  cmp    $0x5f,%cl
  jne    L315
L271:
  add    $0x1,%rbx
  movzbl (%rbx),%edi
  cmp    $0x5f,%dil
  je     L271
  movsbl %dil,%edi
  call   <isalnum@plt>
  test   %rax,%rax
  jne    L271
  mov    $0x4,%r12d
  jmp    L63
L65:
  movsbl 0x1(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L326
  jmp    L62
L195:
  lea    0x1(%rbx),%rdx
  movzbl 0x1(%rbx),%eax
  cmp    %al,%cl
  je     L279
  add    $0x2,%rbx
  cmp    $0x5c,%al
  cmovne %rdx,%rbx
  cmpb   $0x0,(%rbx)
  jne    L195
  lea    -0x1(%rbx),%rdx
  mov    $0xffffffff,%r12d
  jmp    L226
L279:
  mov    $0x6,%r12d
L226:
  lea    0x1(%rdx),%rbx
  jmp    L63
L315:
  movsbl %cl,%edi
  call   <isalpha@plt>
  test   %rax,%rax
  jne    L271
  movsbl (%rbx),%edi
  call   <ispunct@plt>
  test   %rax,%rax
  je     L87
  add    $0x1,%rbx
  mov    $0x5,%r12d
  jmp    L63
L338:
  mov    $0xffffffff,%r12d
  jmp    L63
L87:
  mov    $0xffffffff,%r12d
  jmp    L63
```

assistant: ```c
int stok(const char *s, char **endptr) {
  int rc;
  const char *t = s;
  if (*t == '\0') {
    rc = 0;
  } else if (isspace(*t)) {
    while (isspace(*++t))
      ;
    rc = 1;
  } else if (isdigit(*t)) {
    rc = 2;
    if (*t == '0' && (t[1] == 'x' || t[1] == 'X')) {
      ++t;
      while (isxdigit(*++t))
        ;
    } else {
      while (isdigit(*++t))
        ;
    tok_float:
      if (*t == '.') {
        rc = 3;
        while (isdigit(*++t))
          ;
      }
      if (*t == 'e' || *t == 'E') {
        if (t[1] == '+' || t[1] == '-')
          ++t;
        if (!isdigit(*++t)) {
          rc = (-1);
        } else {
          while (isdigit(*++t))
            ;
        }
      }
    }
  } else if (*t == '.' && isdigit(t[1])) {
    goto tok_float;
  } else if (*t == '\'' || *t == '"') {
    char delimiter = *t;
    rc = 6;
    while (*++t != delimiter) {
      if (*t == '\\')
        ++t;
      if (*t == '\0') {
        rc = (-1);
        --t;
        break;
      }
    }
    ++t;
  } else if (*t == '_' || isalpha(*t)) {
    while (*++t == '_' || isalnum(*t))
      ;
    rc = 4;
  } else if (ispunct(*t)) {
    ++t;
    rc = 5;
  } else {
    rc = (-1);
  }
  if (endptr) {
    *endptr = (char *)t;
  }
  return rc;
}
```