user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<psys_vercmp>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  nopw   0x0(%rax,%rax,1)
L2:
  mov    %rbx,%rdi
  call   <strlen@plt>
  mov    %rbx,%rdi
  mov    %eax,%r12d
  call   <strlen@plt>
  or     %r12d,%eax
  je     L213
  movzbl (%rbx),%ecx
  movzbl 0x0(%rbp),%esi
  lea    -0x30(%rcx),%eax
  lea    -0x30(%rsi),%edx
  cmp    $0x9,%al
  setbe  %r8b
  cmp    $0x9,%dl
  setbe  %dil
  cmp    %dil,%r8b
  je     L194
  cmp    $0xa,%al
  sbb    %eax,%eax
  and    $0x2,%eax
  sub    $0x1,%eax
L213:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopw   0x0(%rax,%rax,1)
L194:
  cmp    $0x9,%al
  jbe    L132
  mov    %rbx,%r12
  test   %cl,%cl
  je     L214
  nopl   0x0(%rax,%rax,1)
L36:
  mov    $0x1,%edi
  add    $0x1,%r12
  call   <assert@plt>
  cmpb   $0x0,(%r12)
  jne    L36
  mov    %r12,%r13
  sub    %rbx,%r13
  cmpb   $0x0,0x0(%rbp)
  je     L18
L40:
  mov    %rbp,%r14
  nopl   0x0(%rax,%rax,1)
L225:
  mov    $0x1,%edi
  add    $0x1,%r14
  call   <assert@plt>
  cmpb   $0x0,(%r14)
  jne    L225
  mov    %r14,%rax
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  mov    %r12,%rbx
  sub    %rbp,%rax
  mov    %r14,%rbp
  cmp    %rax,%r13
  cmovb  %rax,%r13
L171:
  mov    %r13,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L213
L115:
  xor    %eax,%eax
  cmpb   $0x2e,(%rbx)
  sete   %al
  add    %rax,%rbx
  xor    %eax,%eax
  cmpb   $0x2e,0x0(%rbp)
  sete   %al
  add    %rax,%rbp
  jmp    L2
  nopl   0x0(%rax)
L132:
  cmp    $0x30,%cl
  jne    L158
  nopl   0x0(%rax)
L157:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  cmp    $0x30,%al
  je     L157
  sub    $0x30,%eax
  mov    %rbx,%rdi
  cmp    $0x30,%sil
  jne    L137
  nopl   0x0(%rax,%rax,1)
L11:
  movzbl 0x1(%rbp),%edx
  add    $0x1,%rbp
  cmp    $0x30,%dl
  je     L11
  sub    $0x30,%edx
L137:
  cmp    $0x9,%al
  ja     L70
  nopl   0x0(%rax)
L1:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  sub    $0x30,%eax
  cmp    $0x9,%al
  jbe    L1
  mov    %rbx,%r13
  mov    %rbp,%rsi
  sub    %rdi,%r13
L23:
  cmp    $0x9,%dl
  ja     L171
  nopl   0x0(%rax)
L110:
  movzbl 0x1(%rbp),%eax
  add    $0x1,%rbp
  sub    $0x30,%eax
  cmp    $0x9,%al
  jbe    L110
  mov    %rbp,%rax
  sub    %rsi,%rax
  cmp    %rax,%r13
  cmovb  %rax,%r13
  jmp    L171
  nopl   0x0(%rax)
L214:
  xor    %r13d,%r13d
  test   %sil,%sil
  jne    L40
  jmp    L115
  nopl   0x0(%rax)
L158:
  mov    %rbx,%rdi
  cmp    $0x30,%sil
  je     L11
  jmp    L1
  nop
L70:
  mov    %rbp,%rsi
  xor    %r13d,%r13d
  jmp    L23
  nopl   0x0(%rax,%rax,1)
L18:
  mov    %rbx,%rdi
  mov    %rbp,%rsi
  mov    %r12,%rbx
  jmp    L171
```

assistant: ```c
int psys_vercmp(const char *version1, const char *version2) {
  int v1_len, v2_len;
  const char *v1s_start, *v2s_start;
  const char *v1s_end, *v2s_end;
  int v1s_isdigit, v2s_isdigit;
  int diff;
  v1_len = strlen(version1);
  v2_len = strlen(version1);
  if (!v1_len && !v2_len) {
    if (v1_len)
      return 1;
    else if (v2_len)
      return -1;
    else
      return 0;
  }
  v1s_start = v1s_end = version1;
  v2s_start = v2s_end = version2;
  v1s_isdigit = (*v1s_start >= '0' && *v1s_start <= '9');
  v2s_isdigit = (*v2s_start >= '0' && *v2s_start <= '9');
  diff = 0;
  if (v1s_isdigit == v2s_isdigit) {
    size_t v1s_len, v2s_len;
    if (v1s_isdigit) {
      while (*v1s_start == '0') {
        v1s_start++;
        v1s_end++;
      }
      while (*v2s_start == '0') {
        v2s_start++;
        v2s_end++;
      }
      while ((*v1s_end >= '0' && *v1s_end <= '9'))
        v1s_end++;
      while ((*v2s_end >= '0' && *v2s_end <= '9'))
        v2s_end++;
    } else {
      while (*v1s_end) {
        assert((*v1s_end >= 'a' || *v1s_end <= 'z'));
        v1s_end++;
      }
      while (*v2s_end) {
        assert((*v2s_end >= 'a' || *v2s_end <= 'z'));
        v2s_end++;
      }
    }
    v1s_len = v1s_end - v1s_start;
    v2s_len = v2s_end - v2s_start;
    diff = strncmp(v1s_start, v2s_start, (v1s_len > v2s_len) ? v1s_len : v2s_len);
  } else {
    if (v1s_isdigit)
      diff = 1;
    else
      diff = -1;
  }
  if (diff)
    return diff;
  else {
    if (*v1s_end == '.')
      v1s_end++;
    if (*v2s_end == '.')
      v2s_end++;
    return psys_vercmp(v1s_end, v2s_end);
  }
}
```