user: 这段汇编代码用C语言表示是什么样的?

```asm
<ftp_expected_bytes>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  jmp    L17
L24:
  addq   $0x1,-0x18(%rbp)
L17:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L225
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L24
L225:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L121
  mov    $0x0,%eax
  jmp    L128
L121:
  addq   $0x1,-0x18(%rbp)
  jmp    L199
L156:
  addq   $0x1,-0x18(%rbp)
L199:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L64
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L156
L64:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L72
  mov    $0x0,%eax
  jmp    L128
L72:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L91
  movq   $0x0,-0x8(%rbp)
L100:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  movslq %eax,%rcx
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  add    %rcx,%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L136
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L100
L136:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L26
  mov    $0x0,%eax
  jmp    L128
L28:
  addq   $0x1,-0x18(%rbp)
L26:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L168
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L28
L168:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L47
  mov    $0x0,%eax
  jmp    L128
L47:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  cmp    $0x62,%al
  jne    L107
  mov    -0x18(%rbp),%rax
  mov    $0x4,%edx
  lea    D3(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncasecmp@plt>
  test   %rax,%rax
  je     L40
  jmp    L207
L91:
  nop
  jmp    L17
L107:
  nop
L207:
  jmp    L17
L40:
  nop
  mov    -0x8(%rbp),%rax
L128:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D3
type_guessed: string

tool: D3: byte

assistant: ```c
long ftp_expected_bytes(const char *s) {
  long res;
  while (1) {
    while (*s && *s != '(')
      ++s;
    if (!*s)
      return 0;
    for (++s; *s && isspace((unsigned char)(*s)); s++)
      ;
    if (!*s)
      return 0;
    if (!isdigit((unsigned char)(*s)))
      continue;
    res = 0;
    do {
      res = (*s - '0') + 10 * res;
      ++s;
    } while (*s && isdigit((unsigned char)(*s)));
    if (!*s)
      return 0;
    while (*s && isspace((unsigned char)(*s)))
      ++s;
    if (!*s)
      return 0;
    if (tolower(*s) != 'b')
      continue;
    if (strncasecmp(s, "byte", 4))
      continue;
    else
      break;
  }
  return res;
}
```