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

```asm
<scan>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L36:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  cmpb   $0x3f,-0x9(%rbp)
  jne    L346
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  cmpb   $0x39,-0x9(%rbp)
  jg     L202
  cmpb   $0x21,-0x9(%rbp)
  jne    L52
  jmp    L287
L52:
  cmpb   $0x2f,-0x9(%rbp)
  jle    L40
  jmp    L19
L202:
  cmpb   $0x5a,-0x9(%rbp)
  jg     L184
  cmpb   $0x40,-0x9(%rbp)
  jle    L40
  jmp    L19
L184:
  cmpb   $0x60,-0x9(%rbp)
  jle    L294
  cmpb   $0x7a,-0x9(%rbp)
  jle    L329
  jmp    L40
L346:
  nop
  jmp    L40
L294:
  nop
L40:
  addq   $0x1,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x30,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x0,(%rax)
  mov    -0x8(%rbp),%rax
  sub    -0x18(%rbp),%rax
  jmp    L38
L329:
  nop
L19:
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  cmpb   $0x40,-0x9(%rbp)
  jg     L72
  cmpb   $0x2f,-0x9(%rbp)
  jle    L58
  cmpb   $0x39,-0x9(%rbp)
  jg     L261
  jmp    L19
L72:
  cmpb   $0x5a,-0x9(%rbp)
  jg     L200
  jmp    L19
L200:
  cmpb   $0x60,-0x9(%rbp)
  jle    L339
  cmpb   $0x7a,-0x9(%rbp)
  jg     L17
  jmp    L19
L58:
  nop
  jmp    L261
L339:
  nop
  jmp    L261
L17:
  nop
L261:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x32,(%rax)
  jmp    L211
L287:
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  cmpb   $0x40,-0x9(%rbp)
  jg     L201
  cmpb   $0x2f,-0x9(%rbp)
  jle    L188
  cmpb   $0x39,-0x9(%rbp)
  jg     L358
  jmp    L287
L201:
  cmpb   $0x5a,-0x9(%rbp)
  jg     L289
  jmp    L287
L289:
  cmpb   $0x60,-0x9(%rbp)
  jle    L117
  cmpb   $0x7a,-0x9(%rbp)
  jg     L69
  jmp    L287
L188:
  nop
  jmp    L358
L117:
  nop
  jmp    L358
L69:
  nop
L358:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x31,(%rax)
  nop
L211:
  jmp    L36
L38:
  pop    %rbp
  ret
```

assistant: ```c
size_t scan(const char *s, int l, char *r) {
  const char *p = s;
  const char *q;
  while (1) {
    {
      char yych;
      if (((s + l) - p) < 2)
        ;
      yych = *p;
      if (yych != '?')
        goto yy4;
      yych = *++p;
      if (yych <= '9') {
        if (yych == '!')
          goto yy9;
        if (yych >= '0')
          goto yy6;
      } else {
        if (yych <= 'Z') {
          if (yych >= 'A')
            goto yy6;
        } else {
          if (yych <= '`')
            goto yy3;
          if (yych <= 'z')
            goto yy6;
        }
      }
    yy3:
    yy4:
      ++p;
      {
        *r++ = '0';
        *r++ = '\0';
        return p - s;
      }
    yy6:
      ++p;
      if ((s + l) <= p)
        ;
      yych = *p;
      if (yych <= '@') {
        if (yych <= '/')
          goto yy8;
        if (yych <= '9')
          goto yy6;
      } else {
        if (yych <= 'Z')
          goto yy6;
        if (yych <= '`')
          goto yy8;
        if (yych <= 'z')
          goto yy6;
      }
    yy8 : {
      *r++ = '2';
      continue;
    }
    yy9:
      ++p;
      if ((s + l) <= p)
        ;
      yych = *p;
      if (yych <= '@') {
        if (yych <= '/')
          goto yy11;
        if (yych <= '9')
          goto yy9;
      } else {
        if (yych <= 'Z')
          goto yy9;
        if (yych <= '`')
          goto yy11;
        if (yych <= 'z')
          goto yy9;
      }
    yy11 : {
      *r++ = '1';
      continue;
    }
    }
  }
}
```