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

```asm
<get_keyword_visual>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x98,%rsp
  movzbl (%rdi),%edx
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  cmp    $0x20,%dl
  jne    L349
  mov    $0x1,%eax
  nopl   0x0(%rax)
L197:
  mov    %eax,%r12d
  add    $0x1,%rax
  movzbl -0x1(%rbp,%rax,1),%edx
  cmp    $0x20,%dl
  je     L197
  add    $0x1,%r12d
  movslq %r12d,%r14
L67:
  cmp    $0x21,%dl
  je     L164
  lea    D38(%rip),%rdi
  call   <HECMW_vis_print_exit@plt>
L164:
  add    %rbp,%r14
  movzbl (%r14),%ecx
  cmp    $0x2c,%cl
  ja     L216
  movabs $0xffffeffefffffbff,%rax
  bt     %rcx,%rax
  jae    L78
L216:
  movslq %r12d,%rax
  lea    -0x1(%rsp),%rsi
  movabs $0xffffeffefffffbff,%r8
  lea    0x1(%rbp,%rax,1),%rdx
  mov    $0x1,%eax
  nopl   (%rax)
L294:
  mov    %cl,(%rsi,%rax,1)
  movzbl (%rdx),%ecx
  lea    (%r12,%rax,1),%ebx
  movslq %eax,%rdi
  mov    %rdx,%r14
  add    $0x1,%rax
  add    $0x1,%rdx
  cmp    $0x2c,%cl
  ja     L294
  bt     %rcx,%r8
  jb     L294
L230:
  mov    %rsp,%r12
  movb   $0x0,(%rsp,%rdi,1)
  mov    %r12,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  jle    L194
  sub    $0x1,%eax
  mov    %r12,%r13
  lea    0x1(%rsp,%rax,1),%r15
  nopl   0x0(%rax)
L119:
  movsbl 0x0(%r13),%edi
  add    $0x1,%r13
  call   <tolower@plt>
  mov    %al,-0x1(%r13)
  cmp    %r15,%r13
  jne    L119
L194:
  mov    $0x6,%edx
  lea    D83(%rip),%rsi
  mov    %r12,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L44
L120:
  movzbl (%r14),%edx
  cmp    $0x3d,%dl
  je     L116
  cmp    $0xa,%dl
  lea    0x1(%rbx),%eax
  setne  %cl
  cltq
  test   %cl,%cl
  je     L116
  nopl   0x0(%rax)
L353:
  movzbl 0x0(%rbp,%rax,1),%edx
  mov    %eax,%ebx
  add    $0x1,%rax
  cmp    $0x3d,%dl
  je     L116
  cmp    $0xa,%dl
  jne    L353
L87:
  lea    D33(%rip),%rdi
  call   <HECMW_vis_print_exit@plt>
  jmp    L320
  nopl   0x0(%rax,%rax,1)
L116:
  cmp    $0xa,%dl
  je     L87
L320:
  lea    0x1(%rbx),%r14d
  movslq %r14d,%r13
  add    %rbp,%r13
  movzbl 0x0(%r13),%edx
  cmp    $0x20,%dl
  jne    L362
  lea    0x2(%rbx),%eax
  cltq
  cs nopw 0x0(%rax,%rax,1)
L80:
  mov    %eax,%r14d
  lea    0x0(%rbp,%rax,1),%r13
  add    $0x1,%rax
  movzbl -0x1(%rbp,%rax,1),%edx
  cmp    $0x20,%dl
  je     L80
L362:
  cmp    $0xa,%dl
  je     L270
L145:
  cmp    $0x3d,%dl
  ja     L5
  movabs $0xdfffeffefffffbff,%rax
  xor    %ecx,%ecx
  bt     %rdx,%rax
  jae    L124
L5:
  movslq %r14d,%r13
  mov    $0x1,%eax
  lea    -0x1(%rsp),%rsi
  movabs $0xdfffeffefffffbff,%rdi
  add    %r13,%rbp
L45:
  mov    %dl,(%rsi,%rax,1)
  movzbl 0x0(%rbp,%rax,1),%edx
  movslq %eax,%rcx
  add    $0x1,%rax
  cmp    $0x3d,%dl
  ja     L45
  bt     %rdx,%rdi
  jb     L45
L124:
  mov    %r12,%rdi
  movb   $0x0,(%rsp,%rcx,1)
  call   <strlen@plt>
  test   %eax,%eax
  jle    L342
  sub    $0x1,%eax
  mov    %r12,%rbx
  lea    0x1(%rsp,%rax,1),%rbp
  nopl   (%rax)
L295:
  movsbl (%rbx),%edi
  add    $0x1,%rbx
  call   <tolower@plt>
  mov    %al,-0x1(%rbx)
  cmp    %rbx,%rbp
  jne    L295
L342:
  mov    $0x3,%edx
  lea    D60(%rip),%rsi
  mov    %r12,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L24
  mov    $0x3,%edx
  lea    D12(%rip),%rsi
  mov    %r12,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L24
  mov    $0x3,%edx
  lea    D36(%rip),%rsi
  mov    %r12,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L321
  mov    $0x3,%edx
  lea    D61(%rip),%rsi
  mov    %r12,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L321
  lea    D91(%rip),%rdi
  call   <HECMW_vis_print_exit@plt>
  xor    %eax,%eax
  jmp    L289
  nopl   0x0(%rax,%rax,1)
L24:
  mov    $0x1,%eax
L289:
  mov    0x88(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L59
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L44:
  mov    $0x6,%edx
  lea    D6(%rip),%rsi
  mov    %r12,%rdi
  call   <strncmp@plt>
  mov    %rax,%r8
  xor    %eax,%eax
  test   %r8,%r8
  je     L120
  jmp    L289
  nopl   0x0(%rax)
L78:
  mov    %r12d,%ebx
  xor    %edi,%edi
  jmp    L230
  nopw   0x0(%rax,%rax,1)
L321:
  mov    $0x2,%eax
  jmp    L289
  nop
L270:
  lea    D33(%rip),%rdi
  call   <HECMW_vis_print_exit@plt>
  movzbl 0x0(%r13),%edx
  jmp    L145
  cs nopw 0x0(%rax,%rax,1)
L349:
  mov    $0x1,%r14d
  mov    $0x1,%r12d
  jmp    L67
L59:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D38
datatype: string
name: parse_data
arguments: data_label: D83
datatype: string
name: parse_data
arguments: data_label: D33
datatype: string
name: parse_data
arguments: data_label: D60
datatype: string
name: parse_data
arguments: data_label: D12
datatype: string
name: parse_data
arguments: data_label: D36
datatype: string
name: parse_data
arguments: data_label: D61
datatype: string
name: parse_data
arguments: data_label: D91
datatype: string
name: parse_data
arguments: data_label: D6
datatype: string

tool: D38: ERROR: HEC-MW-VIS-E0002: The control parameter format error: should start from !

tool: D83: VISUAL

tool: D33: ERROR: HEC-MW-VIS-E0006:The control parameter format error: visual ID

tool: D60: PSR

tool: D12: psr

tool: D36: PVR

tool: D61: pvr

tool: D91: ERROR: HEC-MW-VIS-E0007:The control parameter format error: method only can be PSR or PVR

tool: D6: visual

assistant: ```c
int get_keyword_visual(char *buf) {
  int i, j, ii, len_tmp;
  int flag;
  char para[128];
  i = 0;
  while (buf[i] == ' ')
    i++;
  if (buf[i] != '!')
    HECMW_vis_print_exit("ERROR: HEC-MW-VIS-E0002: The control parameter format error: should "
                         "start from !");
  i = i + 1;
  j = 0;
  while ((buf[i] != ' ') && (buf[i] != ',') && (buf[i] != '\n')) {
    para[j] = buf[i];
    i++;
    j++;
  }
  flag = 0;
  para[j] = '\0';
  len_tmp = strlen(para);
  for (ii = 0; ii < len_tmp; ii++) {
    para[ii] = tolower(para[ii]);
  }
  if ((strncmp(para, "VISUAL", 6) != 0) && (strncmp(para, "visual", 6) != 0)) {
    flag = 0;
    return (flag);
  }
  while ((buf[i] != '=') && (buf[i] != '\n'))
    i++;
  if (buf[i] == '\n')
    HECMW_vis_print_exit("ERROR: HEC-MW-VIS-E0006:The control parameter format error: visual "
                         "ID");
  i++;
  while ((buf[i] == ' ') && (buf[i] != '\n'))
    i++;
  if (buf[i] == '\n')
    HECMW_vis_print_exit("ERROR: HEC-MW-VIS-E0006:The control parameter format error: visual "
                         "ID");
  j = 0;
  while ((buf[i] != ' ') && (buf[i] != ',') && (buf[i] != '=') && (buf[i] != '\n')) {
    para[j] = buf[i];
    i++;
    j++;
  }
  para[j] = '\0';
  len_tmp = strlen(para);
  for (ii = 0; ii < len_tmp; ii++) {
    para[ii] = tolower(para[ii]);
  }
  if ((strncmp(para, "PSR", 3) == 0) || (strncmp(para, "psr", 3) == 0)) {
    flag = 1;
    return (flag);
  }
  if ((strncmp(para, "PVR", 3) == 0) || (strncmp(para, "pvr", 3) == 0)) {
    flag = 2;
    return (flag);
  }
  HECMW_vis_print_exit("ERROR: HEC-MW-VIS-E0007:The control parameter format error: method only "
                       "can be PSR or PVR");
  return (flag);
}
```