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

```asm
<get_next_operator>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    $0x2000,%edi
  call   <hefesto_mloc@plt>
  mov    %rax,-0x10(%rbp)
  movq   $0x0,-0x8(%rbp)
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  mov    $0x2000,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  cmpq   $0x0,-0x28(%rbp)
  je     L173
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L129
L173:
  mov    -0x10(%rbp),%rax
  jmp    L177
L99:
  addq   $0x1,-0x18(%rbp)
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
L129:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  sete   %al
  movzbl %al,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  sete   %al
  movzbl %al,%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  sete   %al
  movzbl %al,%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  sete   %al
  movzbl %al,%eax
  cmp    %eax,%edx
  jne    L99
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x10(%rbp),%rax
  add    $0x1fff,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x20(%rbp)
  addq   $0x1,-0x18(%rbp)
  jmp    L13
L73:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x20(%rbp)
  addq   $0x1,-0x18(%rbp)
L13:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2b,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3d,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7c,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x26,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5e,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3c,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3e,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x25,%al
  je     L51
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L60
L51:
  mov    -0x20(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jne    L73
L60:
  mov    -0x20(%rbp),%rax
  movb   $0x0,(%rax)
  mov    -0x18(%rbp),%rax
  sub    -0x28(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x10(%rbp),%rax
L177:
  leave
  ret
```

assistant: ```c
char *get_next_operator(const char *expression, size_t *offset) {
  char *operand = (char *)hefesto_mloc(8192), *o, *o_end = NULL;
  const char *e = expression + (*offset);
  memset(operand, 0, 8192);
  if (expression == NULL || *expression == 0)
    return operand;
  while ((((*e) == ' ') ^ ((*e) == '\t') ^ ((*e) == '\n') ^ ((*e) == '\r'))) {
    e++;
    *offset = *offset + 1;
  }
  o = operand;
  o_end = operand + 8192 - 1;
  *o = *e;
  o++;
  e++;
  while (((*e) == '+' || (*e) == '-' || (*e) == '*' || (*e) == '/' || (*e) == '=' || (*e) == '|' || (*e) == '&' || (*e) == '^' || (*e) == '<' || (*e) == '>' || (*e) == '%' || (*e) == '!') && o != o_end) {
    *o = *e;
    o++;
    e++;
  }
  *o = 0;
  *offset = (e - expression);
  return operand;
}
```