user: Please show me the C implementation that matches the assembly code listed below:

```asm
<print_results>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %edx,-0x2c(%rbp)
  cmpl   $0x42,-0x2c(%rbp)
  ja     L30
  mov    -0x2c(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D73(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D73(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D98(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  setl   %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D95(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  setle  %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D107(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  setg   %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D51(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  setge  %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D48(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D85(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  setne  %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D143(%rip),%rax
  mov    %rax,-0x10(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  je     L37
  cmpl   $0x0,-0x28(%rbp)
  je     L37
  mov    $0x1,%eax
  jmp    L42
L37:
  mov    $0x0,%eax
L42:
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D75(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  and    -0x28(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D29(%rip),%rax
  mov    %rax,-0x10(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  jne    L137
  cmpl   $0x0,-0x28(%rbp)
  je     L21
L137:
  mov    $0x1,%eax
  jmp    L122
L21:
  mov    $0x0,%eax
L122:
  mov    %eax,-0x14(%rbp)
  jmp    L30
  lea    D9(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  or     -0x28(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  nop
L30:
  cmpq   $0x0,-0x10(%rbp)
  je     L109
  cmpl   $0x0,-0x14(%rbp)
  je     L59
  lea    D147(%rip),%rax
  jmp    L15
L59:
  lea    D110(%rip),%rax
L15:
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rdi
  mov    -0x14(%rbp),%esi
  mov    -0x28(%rbp),%ecx
  mov    -0x10(%rbp),%rdx
  mov    -0x24(%rbp),%eax
  mov    %rdi,%r9
  mov    %esi,%r8d
  mov    %eax,%esi
  lea    D58(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L109:
  nop
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D98
type: string
name: unpack_data
arguments: data_label: D95
type: string
name: unpack_data
arguments: data_label: D107
type: string
name: unpack_data
arguments: data_label: D51
type: string
name: unpack_data
arguments: data_label: D48
type: string
name: unpack_data
arguments: data_label: D85
type: string
name: unpack_data
arguments: data_label: D143
type: string
name: unpack_data
arguments: data_label: D75
type: string
name: unpack_data
arguments: data_label: D29
type: string
name: unpack_data
arguments: data_label: D9
type: string
name: unpack_data
arguments: data_label: D147
type: string
name: unpack_data
arguments: data_label: D110
type: string
name: unpack_data
arguments: data_label: D58
type: string

tool: D98: <

tool: D95: <=

tool: D107: >

tool: D51: >=

tool: D48: ==

tool: D85: !=

tool: D143: &&

tool: D75: &

tool: D29: ||

tool: D9: |

tool: D147: TRUE

tool: D110: FALSE

tool: D58: 
%d %s %d evaluates to %d (%s)


assistant: ```c
void print_results(int a, int b, int option) {
  char *op;
  int result;
  char *truthValue;
  switch (option) {
  case 1:
    op = "<";
    result = a < b;
    break;
  case 11:
    op = "<=";
    result = a <= b;
    break;
  case 2:
    op = ">";
    result = a > b;
    break;
  case 22:
    op = ">=";
    result = a >= b;
    break;
  case 3:
    op = "==";
    result = a == b;
    break;
  case 4:
    op = "!=";
    result = a != b;
    break;
  case 5:
    op = "&&";
    result = a && b;
    break;
  case 55:
    op = "&";
    result = a & b;
    break;
  case 6:
    op = "||";
    result = a || b;
    break;
  case 66:
    op = "|";
    result = a | b;
    break;
  }
  if (op != NULL) {
    truthValue = result != 0 ? "TRUE" : "FALSE";
    printf("\n%d %s %d evaluates to %d (%s)\n", a, op, b, result, truthValue);
  }
}
```