user: 提供的汇编代码用C语言表示会是什么样子:

```asm
<find_in_vocabulary>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  je     L166
  mov    -0x30(%rbp),%rax
  movl   $0x0,(%rax)
L166:
  cmpq   $0x0,-0x28(%rbp)
  je     L117
  cmpl   $0x0,-0x1c(%rbp)
  jle    L117
  cmpq   $0x0,-0x18(%rbp)
  jne    L27
L117:
  mov    $0xffffffff,%eax
  jmp    L29
L27:
  movl   $0x0,-0x10(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  mov    %eax,-0x8(%rbp)
  cmpl   $0x0,-0x8(%rbp)
  js     L107
  cmpl   $0x0,-0x8(%rbp)
  jne    L69
  cmpq   $0x0,-0x30(%rbp)
  je     L69
  mov    -0x30(%rbp),%rax
  movl   $0x1,(%rax)
L69:
  mov    $0x0,%eax
  jmp    L29
L107:
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  mov    %eax,-0x8(%rbp)
  cmpl   $0x0,-0x8(%rbp)
  jg     L129
  cmpl   $0x0,-0x8(%rbp)
  jne    L26
  cmpq   $0x0,-0x30(%rbp)
  je     L26
  mov    -0x30(%rbp),%rax
  movl   $0x1,(%rax)
L26:
  mov    -0xc(%rbp),%eax
  sub    $0x1,%eax
  jmp    L29
L179:
  mov    -0xc(%rbp),%eax
  sub    -0x10(%rbp),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  mov    %eax,-0x8(%rbp)
  cmpl   $0x0,-0x8(%rbp)
  jne    L162
  cmpq   $0x0,-0x30(%rbp)
  je     L77
  mov    -0x30(%rbp),%rax
  movl   $0x1,(%rax)
L77:
  mov    -0x4(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  jmp    L30
L162:
  cmpl   $0x0,-0x8(%rbp)
  jns    L14
  mov    -0x4(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  jmp    L129
L14:
  mov    -0x4(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x10(%rbp)
L129:
  mov    -0x10(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L179
L30:
  mov    -0xc(%rbp),%eax
L29:
  leave
  ret
```

assistant: ```c
int find_in_vocabulary(char *vocabulary[], int vocabulary_size, char *found_name, int *is_equal) {
  if (is_equal != NULL) {
    *is_equal = 0;
  }
  if ((found_name == NULL) || (vocabulary_size <= 0) || (vocabulary == NULL)) {
    return -1;
  }
  int compare_res, first_pos = 0, last_pos = vocabulary_size, middle_pos;
  compare_res = strcmp(vocabulary[0], found_name);
  if (compare_res >= 0) {
    if ((compare_res == 0) && (is_equal != NULL)) {
      *is_equal = 1;
    }
    return 0;
  }
  compare_res = strcmp(vocabulary[last_pos - 1], found_name);
  if (compare_res <= 0) {
    if (compare_res == 0) {
      if (is_equal != NULL) {
        *is_equal = 1;
      }
    }
    return last_pos - 1;
  }
  while (first_pos < last_pos) {
    middle_pos = first_pos + (last_pos - first_pos) / 2;
    compare_res = strcmp(found_name, vocabulary[middle_pos]);
    if (compare_res == 0) {
      if (is_equal != NULL) {
        *is_equal = 1;
      }
      last_pos = middle_pos;
      break;
    } else if (compare_res < 0) {
      last_pos = middle_pos;
    } else {
      first_pos = middle_pos + 1;
    }
  }
  return last_pos;
}
```