user: 下面的汇编指令对应的C源代码是什么:

```asm
<ver_cmp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
L31:
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  jmp    L283
L66:
  addq   $0x1,-0x20(%rbp)
L283:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L165
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L66
L165:
  mov    -0x50(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L332
L221:
  addq   $0x1,-0x18(%rbp)
L332:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L180
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L221
L180:
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x20(%rbp)
  je     L259
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  jmp    L126
L259:
  mov    $0x0,%eax
L126:
  mov    %eax,-0x38(%rbp)
  mov    -0x50(%rbp),%rax
  cmp    %rax,-0x18(%rbp)
  je     L338
  mov    -0x50(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x50(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  jmp    L27
L338:
  mov    $0x0,%eax
L27:
  mov    %eax,-0x34(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  jne    L39
  cmpl   $0x0,-0x38(%rbp)
  je     L49
L39:
  cmpl   $0x0,-0x38(%rbp)
  je     L261
  mov    -0x38(%rbp),%eax
  mov    %eax,%edi
  call   <isalpha@plt>
  test   %eax,%eax
  jne    L261
  addl   $0x100,-0x38(%rbp)
L261:
  cmpl   $0x0,-0x34(%rbp)
  je     L293
  mov    -0x34(%rbp),%eax
  mov    %eax,%edi
  call   <isalpha@plt>
  test   %eax,%eax
  jne    L293
  addl   $0x100,-0x34(%rbp)
L293:
  mov    -0x38(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  je     L180
  mov    -0x38(%rbp),%eax
  sub    -0x34(%rbp),%eax
  jmp    L150
L49:
  nop
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  movq   $0x0,-0x30(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L269
  mov    -0x48(%rbp),%rax
  lea    -0x48(%rbp),%rcx
  mov    $0xa,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strtol@plt>
  mov    %rax,-0x30(%rbp)
L269:
  movq   $0x0,-0x28(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L14
  mov    -0x50(%rbp),%rax
  lea    -0x50(%rbp),%rcx
  mov    $0xa,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strtol@plt>
  mov    %rax,-0x28(%rbp)
L14:
  mov    -0x30(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  je     L303
  mov    -0x30(%rbp),%rax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  jmp    L150
L303:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x50(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x38(%rbp),%eax
  mov    %eax,%esi
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x34(%rbp),%eax
  mov    %eax,%esi
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  je     L137
  cmpq   $0x0,-0x8(%rbp)
  jne    L137
  mov    $0xffffffff,%eax
  jmp    L150
L137:
  cmpq   $0x0,-0x10(%rbp)
  jne    L184
  cmpq   $0x0,-0x8(%rbp)
  je     L184
  mov    $0x1,%eax
  jmp    L150
L184:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L299
  mov    -0x50(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L299
  mov    $0x0,%eax
  jmp    L150
L299:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L12
  mov    $0xffffffff,%eax
  jmp    L150
L12:
  mov    -0x50(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L31
  mov    $0x1,%eax
L150:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D18
datatype: string

tool: D18: .-

assistant: ```c
int ver_cmp(const char *val, const char *ref) {
  int vc, rc;
  long vl, rl;
  const char *vp, *rp;
  const char *vsep, *rsep;
  for (;;) {
    vp = val;
    while (*vp && !isdigit(*vp))
      vp++;
    rp = ref;
    while (*rp && !isdigit(*rp))
      rp++;
    for (;;) {
      vc = val == vp ? 0 : *val++;
      rc = ref == rp ? 0 : *ref++;
      if (!rc && !vc)
        break;
      if (vc && !isalpha(vc))
        vc += 256;
      if (rc && !isalpha(rc))
        rc += 256;
      if (vc != rc)
        return vc - rc;
    }
    val = vp;
    ref = rp;
    vl = 0;
    if (isdigit(*vp))
      vl = strtol(val, (char **)&val, 10);
    rl = 0;
    if (isdigit(*rp))
      rl = strtol(ref, (char **)&ref, 10);
    if (vl != rl)
      return vl - rl;
    vc = *val;
    rc = *ref;
    vsep = strchr(".-", vc);
    rsep = strchr(".-", rc);
    if (vsep && !rsep)
      return -1;
    if (!vsep && rsep)
      return +1;
    if (!*val && !*ref)
      return 0;
    if (!*val)
      return -1;
    if (!*ref)
      return +1;
  }
}
```