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

```asm
<tok_is_multi_char_token>:
  endbr64
  push   %rbp
  lea    D141(%rip),%rsi
  mov    %rdi,%rbp
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D145(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D171(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D25(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D89(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D164(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D131(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D154(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D122(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D33(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D163(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D175(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D48(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D3(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D93(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D50(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L20
  lea    D176(%rip),%rsi
  mov    %rbp,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L148
  mov    %rbp,%rdi
  lea    D82(%rip),%rsi
  call   <strstarts@plt>
  pop    %rbp
  cmp    $0x1,%rax
  sbb    %eax,%eax
  or     $0x3,%eax
  ret
  nop
L20:
  mov    $0x2,%eax
  pop    %rbp
  ret
L148:
  mov    $0x3,%eax
  pop    %rbp
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D141
type: string
name: disassemble_data
arguments: tag: D145
type: string
name: disassemble_data
arguments: tag: D171
type: string
name: disassemble_data
arguments: tag: D25
type: string
name: disassemble_data
arguments: tag: D89
type: string
name: disassemble_data
arguments: tag: D164
type: string
name: disassemble_data
arguments: tag: D131
type: string
name: disassemble_data
arguments: tag: D154
type: string
name: disassemble_data
arguments: tag: D122
type: string
name: disassemble_data
arguments: tag: D33
type: string
name: disassemble_data
arguments: tag: D163
type: string
name: disassemble_data
arguments: tag: D175
type: string
name: disassemble_data
arguments: tag: D48
type: string
name: disassemble_data
arguments: tag: D3
type: string
name: disassemble_data
arguments: tag: D93
type: string
name: disassemble_data
arguments: tag: D50
type: string
name: disassemble_data
arguments: tag: D176
type: string
name: disassemble_data
arguments: tag: D82
type: string

tool: D141: <<

tool: D145: >>

tool: D171: ==

tool: D25: !=

tool: D89: >=

tool: D164: <=

tool: D131: &&

tool: D154: ||

tool: D122: +=

tool: D33: -=

tool: D163: *=

tool: D175: /=

tool: D48: %=

tool: D3: &=

tool: D93: |=

tool: D50: ^=

tool: D176: <<=

tool: D82: >>=

assistant: ```c
int tok_is_multi_char_token(char *str) {
  if (strstarts(str, "<<"))
    return 2;
  else if (strstarts(str, ">>"))
    return 2;
  else if (strstarts(str, "=="))
    return 2;
  else if (strstarts(str, "!="))
    return 2;
  else if (strstarts(str, ">="))
    return 2;
  else if (strstarts(str, "<="))
    return 2;
  else if (strstarts(str, "&&"))
    return 2;
  else if (strstarts(str, "||"))
    return 2;
  else if (strstarts(str, "+="))
    return 2;
  else if (strstarts(str, "-="))
    return 2;
  else if (strstarts(str, "*="))
    return 2;
  else if (strstarts(str, "/="))
    return 2;
  else if (strstarts(str, "%="))
    return 2;
  else if (strstarts(str, "&="))
    return 2;
  else if (strstarts(str, "|="))
    return 2;
  else if (strstarts(str, "^="))
    return 2;
  else if (strstarts(str, "<<="))
    return 3;
  else if (strstarts(str, ">>="))
    return 3;
  return -1;
}
```