user: 请从给定的汇编指令推导出C源代码:

```asm
<get_next_number>:
  endbr64
  mov    %rdx,%r8
  movsbl (%rdi),%edx
  cmp    $0x20,%dl
  je     L430
  cmp    $0x9,%dl
  jne    L11
L430:
  mov    $0x1,%eax
  nopl   (%rax)
L437:
  movsbl (%rdi,%rax,1),%edx
  mov    %eax,%r10d
  mov    %rax,%rcx
  add    $0x1,%rax
  cmp    $0x20,%dl
  je     L437
  cmp    $0x9,%dl
  je     L437
L203:
  xor    %r9d,%r9d
  test   %dl,%dl
  je     L248
  push   %rbx
  cmp    $0x24,%dl
  je     L336
  cmp    $0x30,%dl
  je     L4
  cmp    $0x25,%dl
  je     L429
  lea    -0x30(%rdx),%ecx
  cmp    $0x9,%cl
  jbe    L154
  mov    %edx,%eax
  and    $0xffffffdf,%eax
  sub    $0x41,%eax
  cmp    $0x5,%al
  ja     L198
  mov    %ecx,%r9d
  mov    %edx,%eax
  mov    %edx,%ecx
L105:
  and    $0xffffffdf,%eax
  sub    $0x41,%eax
  cmp    $0x5,%al
  jbe    L29
  and    $0xffffffdf,%ecx
  cmp    $0x48,%cl
  jne    L109
L29:
  movslq %r10d,%rcx
  xor    %eax,%eax
  jmp    L387
  nop
L307:
  shl    $0x4,%eax
  lea    -0x30(%rax,%rdx,1),%eax
L31:
  add    $0x1,%rcx
L387:
  movsbl (%rdi,%rcx,1),%edx
  mov    %ecx,%r10d
  lea    -0x30(%rdx),%r9d
  cmp    $0x9,%r9b
  jbe    L307
  lea    -0x61(%rdx),%r9d
  cmp    $0x5,%r9b
  ja     L299
  shl    $0x4,%eax
  lea    -0x57(%rax,%rdx,1),%eax
  jmp    L31
  nopl   0x0(%rax,%rax,1)
L248:
  mov    %r9d,%eax
  ret
  nopl   0x0(%rax)
L336:
  lea    0x1(%r10),%ecx
L183:
  movslq %ecx,%rcx
  xor    %eax,%eax
  jmp    L428
  nopl   0x0(%rax,%rax,1)
L303:
  shl    $0x4,%eax
  lea    -0x30(%rax,%rdx,1),%eax
L142:
  add    $0x1,%rcx
L428:
  movsbl (%rdi,%rcx,1),%edx
  mov    %ecx,%r10d
  lea    -0x30(%rdx),%r9d
  cmp    $0x9,%r9b
  jbe    L303
  lea    -0x61(%rdx),%r9d
  cmp    $0x5,%r9b
  ja     L82
  shl    $0x4,%eax
  lea    -0x57(%rax,%rdx,1),%eax
  jmp    L142
  nopl   0x0(%rax,%rax,1)
L429:
  add    $0x1,%r10d
L343:
  movslq %r10d,%rax
  movzbl (%rdi,%rax,1),%ecx
  lea    0x1(%rdi,%rax,1),%rdi
  xor    %eax,%eax
  test   %cl,%cl
  jne    L107
  jmp    L2
L22:
  movzbl (%rdi),%ecx
  movsbl %dl,%edx
  add    $0x1,%rdi
  add    $0x1,%r10d
  lea    (%rdx,%rax,2),%eax
  test   %cl,%cl
  je     L2
L107:
  lea    -0x30(%rcx),%edx
  cmp    $0x1,%dl
  jbe    L22
  cmp    $0x20,%cl
  je     L2
  cmp    $0x9,%cl
  je     L2
L87:
  xor    %r9d,%r9d
  pop    %rbx
  mov    %r9d,%eax
  ret
  nop
L11:
  xor    %r10d,%r10d
  xor    %ecx,%ecx
  jmp    L203
  nopw   0x0(%rax,%rax,1)
L114:
  test   $0xdf,%dl
  je     L2
  cmp    $0x9,%dl
  jne    L87
L2:
  mov    %eax,(%rsi)
  mov    $0x1,%r9d
  test   %r8,%r8
  je     L198
  add    %r10d,(%r8)
L198:
  mov    %r9d,%eax
  pop    %rbx
  ret
  nop
L82:
  lea    -0x41(%rdx),%r9d
  cmp    $0x5,%r9b
  ja     L114
  shl    $0x4,%eax
  lea    -0x37(%rax,%rdx,1),%eax
  jmp    L142
  cs nopw 0x0(%rax,%rax,1)
L299:
  lea    -0x41(%rdx),%r9d
  cmp    $0x5,%r9b
  ja     L21
  shl    $0x4,%eax
  lea    -0x37(%rax,%rdx,1),%eax
  jmp    L31
  cs nopw 0x0(%rax,%rax,1)
L4:
  movzbl 0x1(%rdi,%rcx,1),%eax
  and    $0xffffffdf,%eax
  cmp    $0x58,%al
  je     L40
  cmp    $0x42,%al
  je     L477
L154:
  movslq %r10d,%rax
  lea    -0x30(%rdx),%r9d
  lea    0x1(%rdi,%rax,1),%r11
L195:
  movzbl (%r11),%ecx
  add    $0x1,%r11
  lea    -0x30(%rcx),%ebx
  mov    %ecx,%eax
  cmp    $0x9,%bl
  ja     L105
  jmp    L195
L477:
  add    $0x2,%r10d
  jmp    L343
L40:
  lea    0x2(%r10),%ecx
  jmp    L183
  cs nopw 0x0(%rax,%rax,1)
L21:
  mov    %edx,%ecx
  and    $0xffffffdf,%ecx
  cmp    $0x48,%cl
  je     L2
  cmp    $0x20,%dl
  ja     L87
  movabs $0x100000201,%rcx
  bt     %rdx,%rcx
  jae    L87
  jmp    L2
L109:
  lea    0x1(%r10),%ecx
  xor    %eax,%eax
  movslq %ecx,%rcx
  cmp    $0x9,%r9b
  ja     L185
  nop
L243:
  lea    (%rax,%rax,4),%eax
  mov    %ecx,%r10d
  lea    -0x30(%rdx,%rax,2),%eax
  movsbl (%rdi,%rcx,1),%edx
  add    $0x1,%rcx
  lea    -0x30(%rdx),%r9d
  cmp    $0x9,%r9b
  jbe    L243
L185:
  test   $0xdf,%dl
  je     L2
  xor    %r9d,%r9d
  cmp    $0x9,%dl
  je     L2
  jmp    L198
```

assistant: ```c
int get_next_number(char *in, int *out, int *pos) {
  int i, o, n;
  for (i = 0; in[i] == ' ' || in[i] == 0x09; i++)
    ;
  if (in[i] == 0)
    return 0;
  if (in[i] == '$' || (in[i] == '0' && (in[i + 1] == 'x' || in[i + 1] == 'X'))) {
    if (in[i] == '$')
      i++;
    else
      i += 2;
    o = 0;
    while (1) {
      if (in[i] >= '0' && in[i] <= '9')
        o = (o << 4) + in[i] - '0';
      else if (in[i] >= 'a' && in[i] <= 'f')
        o = (o << 4) + in[i] - 'a' + 0xA;
      else if (in[i] >= 'A' && in[i] <= 'F')
        o = (o << 4) + in[i] - 'A' + 0xA;
      else if (in[i] == ' ' || in[i] == 0x09 || in[i] == 0)
        break;
      else
        return 0;
      i++;
    }
  } else if (in[i] == '%' || (in[i] == '0' && (in[i + 1] == 'b' || in[i + 1] == 'B'))) {
    if (in[i] == '%')
      i++;
    else
      i += 2;
    for (o = 0; in[i] != 0; i++) {
      if (in[i] == '0' || in[i] == '1')
        o = (o << 1) + (in[i] - '0');
      else if (in[i] == ' ' || in[i] == 0x09 || in[i] == 0)
        break;
      else
        return 0;
    }
  } else if ((in[i] >= '0' && in[i] <= '9') || (in[i] >= 'a' && in[i] <= 'f') || (in[i] >= 'A' && in[i] <= 'F')) {
    n = 0;
    for (o = 0; 1; o++) {
      if (in[i + o] >= '0' && in[i + o] <= '9')
        continue;
      if (in[i + o] >= 'a' && in[i + o] <= 'f') {
        n = 1;
        break;
      }
      if (in[i + o] >= 'A' && in[i + o] <= 'F') {
        n = 1;
        break;
      }
      if (in[i + o] == 'h' || in[i + o] == 'H') {
        n = 1;
        break;
      }
      break;
    }
    if (n == 1) {
      o = 0;
      while (1) {
        if (in[i] >= '0' && in[i] <= '9')
          o = (o << 4) + in[i] - '0';
        else if (in[i] >= 'a' && in[i] <= 'f')
          o = (o << 4) + in[i] - 'a' + 0xA;
        else if (in[i] >= 'A' && in[i] <= 'F')
          o = (o << 4) + in[i] - 'A' + 0xA;
        else if (in[i] == 'h' || in[i] == 'H')
          break;
        else if (in[i] == ' ' || in[i] == 0x09 || in[i] == 0)
          break;
        else
          return 0;
        i++;
      }
    } else {
      for (o = 0; in[i] >= '0' && in[i] <= '9'; i++)
        o = (o * 10) + in[i] - '0';
      if (!(in[i] == ' ' || in[i] == 0x09 || in[i] == 0))
        return 0;
    }
  } else
    return 0;
  *out = o;
  if (pos != NULL)
    *pos += i;
  return 1;
}
```