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

```asm
<eval_if>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %rsi,-0x20(%rbp)
  movl   $0x0,-0xc(%rbp)
  cmpl   $0x1,-0x14(%rbp)
  jne    L103
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <is_number@plt>
  test   %rax,%rax
  je     L20
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtol@plt>
  test   %eax,%eax
  setne  %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L161
L20:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  test   %al,%al
  setne  %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L161
L103:
  cmpl   $0x2,-0x14(%rbp)
  jne    L256
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  lea    D63(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L161
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <is_number@plt>
  test   %rax,%rax
  je     L99
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtol@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L161
L99:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  test   %al,%al
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L161
L256:
  cmpl   $0x3,-0x14(%rbp)
  jne    L161
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <is_number@plt>
  test   %rax,%rax
  je     L84
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <is_number@plt>
  test   %rax,%rax
  je     L84
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtol@plt>
  mov    %eax,-0x8(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtol@plt>
  mov    %eax,-0x4(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D89(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L135
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L189
L135:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D59(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L125
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  setne  %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L189
L125:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D62(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L56
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  setl   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L189
L56:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D2(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L117
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  setg   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L189
L117:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D80(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L190
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  setl   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L189
L190:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D85(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L189
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  setg   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L189
L84:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D89(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L136
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L161
L136:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D59(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L161
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  setne  %al
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L161
L189:
  nop
L161:
  mov    -0xc(%rbp),%eax
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D63
datatype: string
name: unpack_data
arguments: data_label: D89
datatype: string
name: unpack_data
arguments: data_label: D59
datatype: string
name: unpack_data
arguments: data_label: D62
datatype: string
name: unpack_data
arguments: data_label: D2
datatype: string
name: unpack_data
arguments: data_label: D80
datatype: string
name: unpack_data
arguments: data_label: D85
datatype: string

tool: D63: !

tool: D89: ==

tool: D59: !=

tool: D62: <

tool: D2: >

tool: D80: <=

tool: D85: >=

assistant: ```c
int eval_if(int argc, char *argv[]) {
  int r = 0;
  if (argc == 1) {
    if (is_number(argv[0]))
      r = (strtol(argv[0], 0, 0)) ? 1 : 0;
    else
      r = (*argv[0]) ? 1 : 0;
  } else if (argc == 2) {
    if (strcmp(argv[0], "!") == 0) {
      if (is_number(argv[0]))
        r = (strtol(argv[0], 0, 0)) ? 0 : 1;
      else
        r = (*argv[1]) ? 0 : 1;
    }
  } else if (argc == 3) {
    if (is_number(argv[0]) && is_number(argv[2])) {
      int x, y;
      x = strtol(argv[0], 0, 0);
      y = strtol(argv[2], 0, 0);
      if (strcmp(argv[1], "==") == 0)
        r = (x == y);
      else if (strcmp(argv[1], "!=") == 0)
        r = (x != y);
      else if (strcmp(argv[1], "<") == 0)
        r = (x < y);
      else if (strcmp(argv[1], ">") == 0)
        r = (x > y);
      else if (strcmp(argv[1], "<=") == 0)
        r = (x < y);
      else if (strcmp(argv[1], ">=") == 0)
        r = (x > y);
    } else {
      if (strcmp(argv[1], "==") == 0)
        r = (strcmp(argv[0], argv[2]) == 0) ? 1 : 0;
      else if (strcmp(argv[1], "!=") == 0)
        r = (strcmp(argv[0], argv[2]) != 0) ? 1 : 0;
    }
  }
  return r;
}
```