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

```asm
<gen_parser>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %rdx,%r13
  mov    %rcx,%r12
  mov    %r8,%r14
  call   <gen_known@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <gen_non_term@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <gen_goto@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <gen_states@plt>
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <gen_reduce@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <gen_free@plt>
  mov    %rbx,%rcx
  mov    $0x15,%edx
  mov    $0x1,%esi
  lea    D110(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rdx
  lea    D41(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %rbx,%rcx
  mov    $0x2,%edx
  mov    $0x1,%esi
  lea    D8(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x1d,%edx
  mov    $0x1,%esi
  lea    D63(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x1e,%edx
  mov    $0x1,%esi
  lea    D55(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x37,%edx
  mov    $0x1,%esi
  lea    D20(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x46,%edx
  mov    $0x1,%esi
  lea    D87(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x24,%edx
  mov    $0x1,%esi
  lea    D22(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x55,%edx
  mov    $0x1,%esi
  lea    D25(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x16,%edx
  mov    $0x1,%esi
  lea    D19(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0xc,%edx
  mov    $0x1,%esi
  lea    D81(%rip),%rdi
  call   <fwrite@plt>
  mov    %rbx,%rcx
  mov    $0x3,%edx
  mov    $0x1,%esi
  lea    D26(%rip),%rdi
  call   <fwrite@plt>
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D110
data_type: string
name: unpack_data
arguments: data_label: D41
data_type: string
name: unpack_data
arguments: data_label: D8
data_type: string
name: unpack_data
arguments: data_label: D63
data_type: string
name: unpack_data
arguments: data_label: D55
data_type: string
name: unpack_data
arguments: data_label: D20
data_type: string
name: unpack_data
arguments: data_label: D87
data_type: string
name: unpack_data
arguments: data_label: D22
data_type: string
name: unpack_data
arguments: data_label: D25
data_type: string
name: unpack_data
arguments: data_label: D19
data_type: string
name: unpack_data
arguments: data_label: D81
data_type: string
name: unpack_data
arguments: data_label: D26
data_type: string

tool: D110: #line 0 "gen_parser"


tool: D41: void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace)


tool: D8: {


tool: D63: 	struct token_state *tokens;


tool: D55: 	config->words_marks = known;


tool: D20: 	config->known_count = sizeof(known)/sizeof(known[0]);


tool: D87: 	config->ignored |= (1 << TK_line_comment) | (1 << TK_block_comment);


tool: D22: 	tokens = token_open(code, config);


tool: D25: 	void *rv = parser_run(tokens, states, do_reduce, do_free, trace, non_term, config);


tool: D19: 	token_close(tokens);


tool: D81: 	return rv;


tool: D26: }



assistant: ```c
void gen_parser(FILE *f, struct grammar *g, char *file, char *name, struct code_node *pre_reduce) {
  gen_known(f, g);
  gen_non_term(f, g);
  gen_goto(f, g);
  gen_states(f, g);
  gen_reduce(f, g, file, pre_reduce);
  gen_free(f, g);
  fprintf(f, "#line 0 \"gen_parser\"\n");
  fprintf(f, "void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace)\n", name);
  fprintf(f, "{\n");
  fprintf(f, "\tstruct token_state *tokens;\n");
  fprintf(f, "\tconfig->words_marks = known;\n");
  fprintf(f, "\tconfig->known_count = sizeof(known)/sizeof(known[0]);\n");
  fprintf(f, "\tconfig->ignored |= (1 << TK_line_comment) | (1 << TK_block_comment);\n");
  fprintf(f, "\ttokens = token_open(code, config);\n");
  fprintf(f, "\tvoid *rv = parser_run(tokens, states, do_reduce, do_free, trace, non_term, config);\n");
  fprintf(f, "\ttoken_close(tokens);\n");
  fprintf(f, "\treturn rv;\n");
  fprintf(f, "}\n\n");
}
```