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

```asm
<parseElement>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x850,%rsp
  mov    %rdi,-0x838(%rbp)
  mov    %rsi,-0x840(%rbp)
  mov    %rdx,-0x848(%rbp)
  mov    %rcx,-0x850(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x824(%rbp)
  movl   $0x0,-0x820(%rbp)
  movl   $0x0,-0x81c(%rbp)
  jmp    L150
L310:
  addq   $0x1,-0x838(%rbp)
L150:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L183
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L310
L183:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L211
  addq   $0x1,-0x838(%rbp)
  movl   $0x1,-0x81c(%rbp)
  jmp    L195
L211:
  movl   $0x1,-0x820(%rbp)
L195:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L335
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3f,%al
  je     L335
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  je     L335
  mov    -0x838(%rbp),%rax
  mov    %rax,-0x818(%rbp)
  jmp    L384
L66:
  addq   $0x1,-0x838(%rbp)
L384:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L251
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L66
L251:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L233
  mov    -0x838(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x838(%rbp)
  movb   $0x0,(%rax)
  jmp    L233
L178:
  addq   $0x1,-0x838(%rbp)
L314:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L312
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L178
L312:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L54
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L147
  movl   $0x1,-0x81c(%rbp)
  jmp    L412
L147:
  mov    -0x824(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x824(%rbp)
  cltq
  mov    -0x838(%rbp),%rdx
  mov    %rdx,-0x810(%rbp,%rax,8)
  jmp    L274
L39:
  addq   $0x1,-0x838(%rbp)
L274:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L125
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L125
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3d,%al
  jne    L39
L125:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L26
  mov    -0x838(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x838(%rbp)
  movb   $0x0,(%rax)
  jmp    L26
L79:
  addq   $0x1,-0x838(%rbp)
L26:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L90
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  jne    L79
L90:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L360
  addq   $0x1,-0x838(%rbp)
  mov    -0x824(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x824(%rbp)
  cltq
  mov    -0x838(%rbp),%rdx
  mov    %rdx,-0x810(%rbp,%rax,8)
  jmp    L390
L263:
  addq   $0x1,-0x838(%rbp)
L390:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L42
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  jne    L263
L42:
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L233
  mov    -0x838(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x838(%rbp)
  movb   $0x0,(%rax)
L233:
  cmpl   $0x0,-0x81c(%rbp)
  jne    L412
  mov    -0x838(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L412
  cmpl   $0xfe,-0x824(%rbp)
  jle    L314
  jmp    L412
L54:
  nop
  jmp    L412
L360:
  nop
L412:
  mov    -0x824(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x824(%rbp)
  cltq
  movq   $0x0,-0x810(%rbp,%rax,8)
  mov    -0x824(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x824(%rbp)
  cltq
  movq   $0x0,-0x810(%rbp,%rax,8)
  cmpl   $0x0,-0x820(%rbp)
  je     L366
  cmpq   $0x0,-0x840(%rbp)
  je     L366
  lea    -0x810(%rbp),%rdx
  mov    -0x818(%rbp),%rcx
  mov    -0x850(%rbp),%rax
  mov    -0x840(%rbp),%r8
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   *%r8
L366:
  cmpl   $0x0,-0x81c(%rbp)
  je     L232
  cmpq   $0x0,-0x848(%rbp)
  je     L232
  mov    -0x818(%rbp),%rdx
  mov    -0x850(%rbp),%rax
  mov    -0x848(%rbp),%rcx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   *%rcx
  jmp    L232
L335:
  nop
L232:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L303
  call   <__stack_chk_fail@plt>
L303:
  leave
  ret
```

assistant: ```c
void parseElement(char *s, void (*startelCb)(void *ud, const char *el, const char **attr), void (*endelCb)(void *ud, const char *el), void *ud) {
  const char *attr[256];
  int nattr = 0;
  char *name;
  int start = 0;
  int end = 0;
  while (*s && isspace(*s))
    s++;
  if (*s == '/') {
    s++;
    end = 1;
  } else {
    start = 1;
  }
  if (!*s || *s == '?' || *s == '!')
    return;
  name = s;
  while (*s && !isspace(*s))
    s++;
  if (*s) {
    *s++ = '\0';
  }
  while (!end && *s && nattr < 256 - 1) {
    while (*s && isspace(*s))
      s++;
    if (!*s)
      break;
    if (*s == '/') {
      end = 1;
      break;
    }
    attr[nattr++] = s;
    while (*s && !isspace(*s) && *s != '=')
      s++;
    if (*s) {
      *s++ = '\0';
    }
    while (*s && *s != '\"')
      s++;
    if (!*s)
      break;
    s++;
    attr[nattr++] = s;
    while (*s && *s != '\"')
      s++;
    if (*s) {
      *s++ = '\0';
    }
  }
  attr[nattr++] = 0;
  attr[nattr++] = 0;
  if (start && startelCb)
    (*startelCb)(ud, name, attr);
  if (end && endelCb)
    (*endelCb)(ud, name);
}
```