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

```asm
<is_binary>:
  endbr64
  movzbl (%rdi),%eax
  mov    %rdx,%r11
  test   %esi,%esi
  jle    L200
  push   %r15
  sub    $0x2b,%eax
  movslq %esi,%rsi
  xor    %edx,%edx
  push   %r14
  and    $0xfffffffd,%eax
  xor    %ecx,%ecx
  mov    $0xffffffff,%r10d
  push   %r13
  xor    %r9d,%r9d
  push   %r12
  mov    $0x4,%r12d
  push   %rbp
  mov    $0x3,%ebp
  push   %rbx
  mov    $0x39,%ebx
  mov    %al,-0x1(%rsp)
  xor    %eax,%eax
  nopl   0x0(%rax,%rax,1)
L25:
  movzbl (%rdi,%rax,1),%r8d
  mov    %eax,%r14d
  cmp    $0x28,%r8b
  je     L73
  xor    %r13d,%r13d
  cmp    $0x29,%r8b
  sete   %r13b
  sub    %r13d,%edx
L119:
  test   %edx,%edx
  jg     L132
  cmp    $0x2d,%r8b
  je     L40
  jg     L44
  cmp    $0x2a,%r8b
  je     L177
  cmp    $0x2b,%r8b
  jne    L43
  movabs $0xffff53fffffffffe,%r15
  cmp    $0x5e,%cl
  setne  %r8b
  sar    %cl,%r15
  mov    %r8d,%r13d
  and    %r15d,%r8d
  cmp    $0x30,%cl
  mov    $0x2b,%ecx
  cmovae %r13d,%r8d
  test   %r8b,%r8b
  mov    $0x1,%r8d
  cmovne %r14d,%r10d
  cmovne %r8d,%r9d
  nopl   0x0(%rax,%rax,1)
L132:
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L25
L146:
  pop    %rbx
  mov    %r9d,%eax
  pop    %rbp
  mov    %r10d,(%r11)
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L44:
  cmp    $0x2f,%r8b
  je     L150
  cmp    $0x5e,%r8b
  jne    L43
  mov    $0x5e,%ecx
  test   %r9d,%r9d
  jne    L132
  cmpb   $0x0,-0x1(%rsp)
  mov    $0x5,%r15d
  cmovne %r14d,%r10d
  cmovne %r15d,%r9d
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L146
  nopl   0x0(%rax)
L73:
  add    $0x1,%edx
  jmp    L119
  nopl   0x0(%rax,%rax,1)
L177:
  mov    %r9d,%ecx
  mov    %rbx,%r8
  shr    %cl,%r8
  mov    $0x2a,%ecx
  and    $0x1,%r8d
  cmovne %r14d,%r10d
  cmovne %ebp,%r9d
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L146
  nopl   0x0(%rax)
L150:
  mov    %r9d,%ecx
  mov    %rbx,%r8
  shr    %cl,%r8
  mov    $0x2f,%ecx
  and    $0x1,%r8d
  cmovne %r14d,%r10d
  cmovne %r12d,%r9d
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L146
  nopl   0x0(%rax)
L40:
  movabs $0xffff53fffffffffe,%r15
  cmp    $0x5e,%cl
  setne  %r8b
  sar    %cl,%r15
  mov    %r8d,%r13d
  and    %r15d,%r8d
  cmp    $0x30,%cl
  mov    $0x2,%r15d
  cmovae %r13d,%r8d
  mov    $0x2d,%ecx
  test   %r8b,%r8b
  cmovne %r14d,%r10d
  cmovne %r15d,%r9d
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L146
  nopl   0x0(%rax)
L200:
  mov    $0xffffffff,%r10d
  xor    %r9d,%r9d
  mov    %r10d,(%rdx)
  mov    %r9d,%eax
  ret
L43:
  mov    %r8d,%ecx
  jmp    L132
```

assistant: ```c
int is_binary(const char *string, int length, int *bindex) {
  int op = 0, op_index = -1;
  char c, p = '\0';
  int i, pcount = 0;
  char str0 = string[0];
  for (i = 0; i < length; i++) {
    c = string[i];
    if (c == '(') {
      pcount++;
    } else if (c == ')') {
      pcount--;
    }
    if (pcount > 0)
      continue;
    if (c == '+') {
      if (p != '*' && p != '/' && p != '+' && p != '-' && p != '^' && p != '\0') {
        op = 1;
        op_index = i;
      }
    } else if (c == '-') {
      if (p != '*' && p != '/' && p != '+' && p != '-' && p != '^' && p != '\0') {
        op = 2;
        op_index = i;
      }
    } else if (c == '*') {
      if (op == 0 || op == 3 || op == 4 || op == 5) {
        op = 3;
        op_index = i;
      }
    } else if (c == '/') {
      if (op == 0 || op == 3 || op == 4 || op == 5) {
        op = 4;
        op_index = i;
      }
    } else if (c == '^') {
      if (op == 0 && (str0 != '-' && str0 != '+')) {
        op = 5;
        op_index = i;
      }
    }
    p = c;
  }
  *bindex = op_index;
  return op;
}
```