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

```asm
<condExpr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x24(%rbp),%ecx
  mov    -0x20(%rbp),%rdx
  lea    -0xc(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %ecx,%r8d
  mov    %rdx,%rcx
  mov    $0x4,%edx
  mov    %rax,%rdi
  call   <sisRead@plt>
  test   %rax,%rax
  je     L292
  mov    $0x1,%eax
  jmp    L50
L292:
  mov    -0xc(%rbp),%eax
  mov    %eax,%edi
  call   <sis32toh@plt>
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  cmp    $0xe,%eax
  ja     L236
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D32(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D32(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L110
  mov    $0x1,%eax
  jmp    L50
L110:
  lea    D80(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L246
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L404
  mov    $0x1,%eax
  jmp    L50
L404:
  lea    D160(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L449
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L294
  mov    $0x1,%eax
  jmp    L50
L294:
  lea    D150(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L398
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L291
  mov    $0x1,%eax
  jmp    L50
L291:
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L330
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L374
  mov    $0x1,%eax
  jmp    L50
L374:
  lea    D86(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L303
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L142
  mov    $0x1,%eax
  jmp    L50
L142:
  lea    D50(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L343
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L592
  mov    $0x1,%eax
  jmp    L50
L592:
  lea    D116(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L118
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L132
  mov    $0x1,%eax
  jmp    L50
L132:
  lea    D47(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L558
  mov    $0x1,%eax
  jmp    L50
  lea    D55(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L59
  mov    $0x1,%eax
  jmp    L50
L59:
  lea    D138(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L78
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L410
  mov    $0x1,%eax
  jmp    L50
L410:
  lea    D138(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L78
  lea    D77(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condExpr>
  test   %eax,%eax
  je     L220
  mov    $0x1,%eax
  jmp    L50
L220:
  lea    D138(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L78
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condString@plt>
  test   %eax,%eax
  je     L414
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condAttribute@plt>
  test   %eax,%eax
  je     L248
  mov    $0x1,%eax
  jmp    L50
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <condNumber@plt>
  test   %eax,%eax
  je     L263
  mov    $0x1,%eax
  jmp    L50
L236:
  mov    -0xc(%rbp),%edx
  mov    -0x24(%rbp),%esi
  mov    -0x20(%rbp),%rax
  mov    %edx,%ecx
  lea    D56(%rip),%rdx
  mov    %rax,%rdi
  call   <snprintf@plt>
  mov    $0x1,%eax
  jmp    L50
L246:
  nop
  jmp    L78
L449:
  nop
  jmp    L78
L398:
  nop
  jmp    L78
L330:
  nop
  jmp    L78
L303:
  nop
  jmp    L78
L343:
  nop
  jmp    L78
L118:
  nop
  jmp    L78
L558:
  nop
  jmp    L78
L414:
  nop
  jmp    L78
L248:
  nop
  jmp    L78
L263:
  nop
L78:
  mov    $0x0,%eax
L50:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L480
  call   <__stack_chk_fail@plt>
L480:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D80
datatype: string
name: parse_data
arguments: tag: D160
datatype: string
name: parse_data
arguments: tag: D150
datatype: string
name: parse_data
arguments: tag: D83
datatype: string
name: parse_data
arguments: tag: D86
datatype: string
name: parse_data
arguments: tag: D50
datatype: string
name: parse_data
arguments: tag: D116
datatype: string
name: parse_data
arguments: tag: D47
datatype: string
name: parse_data
arguments: tag: D55
datatype: string
name: parse_data
arguments: tag: D138
datatype: string
name: parse_data
arguments: tag: D9
datatype: string
name: parse_data
arguments: tag: D77
datatype: string
name: parse_data
arguments: tag: D56
datatype: string

tool: D80:  == 

tool: D160:  != 

tool: D150:  > 

tool: D83:  < 

tool: D86:  >= 

tool: D50:  <= 

tool: D116:  AND 

tool: D47:  OR 

tool: D55: EXISTS(

tool: D138: )

tool: D9: DEVCAP(

tool: D77: NOT(

tool: D56: Unknown conditional type %04x

assistant: ```c
int condExpr(FILE *fp, char *err, int errlen) {
  unsigned int condtype;
  if (sisRead(fp, &condtype, 4, err, errlen))
    return 1;
  condtype = sis32toh(condtype);
  switch (condtype) {
  case 0x00:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" == ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x01:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" != ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x02:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" > ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x03:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" < ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x04:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" >= ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x05:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" <= ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x06:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" AND ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x07:
    if (condExpr(fp, err, errlen))
      return 1;
    printf(" OR ");
    if (condExpr(fp, err, errlen))
      return 1;
    break;
  case 0x08:
  case 0x09:
    printf("EXISTS(");
    if (condExpr(fp, err, errlen))
      return 1;
    printf(")");
    break;
  case 0x0a:
    printf("DEVCAP(");
    if (condExpr(fp, err, errlen))
      return 1;
    printf(")");
    break;
  case 0x0b:
    printf("NOT(");
    if (condExpr(fp, err, errlen))
      return 1;
    printf(")");
    break;
  case 0x0c:
    if (condString(fp, err, errlen))
      return 1;
    break;
  case 0x0d:
    if (condAttribute(fp, err, errlen))
      return 1;
    break;
  case 0x0e:
    if (condNumber(fp, err, errlen))
      return 1;
    break;
  default:
    snprintf(err, errlen, "Unknown conditional type %04x", condtype);
    return 1;
    break;
  }
  return 0;
}
```