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

```asm
<compare_dnsname>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  test   %rsi,%rsi
  je     L235
  mov    %rdi,%rbx
  mov    %rsi,%r12
  mov    %rdx,%rbp
  mov    %rcx,%r13
  test   %rcx,%rcx
  je     L235
  cmp    %rcx,%rsi
  je     L219
L269:
  lea    -0x1(%rbx,%r12,1),%rax
  mov    %rax,0x8(%rsp)
  cmpb   $0x0,(%rax)
  jne    L275
  lea    -0x1(%rbp,%r13,1),%r15
  cmpb   $0x0,(%r15)
  jne    L113
  add    %rbx,%r12
  cmp    %r12,%rbx
  jae    L102
  add    %rbp,%r13
  cmp    %r13,%rbp
  jae    L153
  movl   $0x0,0x4(%rsp)
  mov    $0x0,%r14d
  jmp    L357
L219:
  movsbl %sil,%edx
  mov    %rbp,%rsi
  call   <memcmp@plt>
  movl   $0x0,0x4(%rsp)
  test   %rax,%rax
  jne    L269
  jmp    L122
L171:
  mov    0x8(%rsp),%rax
  cmp    %rbx,%rax
  je     L122
  add    $0x1,%rbx
  cmp    %rbx,%rax
  mov    $0xffffffff,%eax
  cmove  0x4(%rsp),%eax
  mov    %eax,0x4(%rsp)
  jmp    L122
L35:
  movl   $0xffffffff,0x4(%rsp)
  jmp    L122
L277:
  cmp    %al,%dl
  je     L207
  movl   $0x1,0x4(%rsp)
L141:
  movsbq (%rbx),%rax
  lea    0x1(%rbx,%rax,1),%rbx
  mov    $0x1,%r14d
  mov    $0x0,%eax
  jmp    L83
L207:
  movsbl %dl,%edx
  lea    0x1(%rbp),%rsi
  lea    0x1(%rbx),%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L278
  movsbq (%rbx),%rax
  lea    0x1(%rbx,%rax,1),%rbx
  movsbl 0x0(%rbp),%eax
  add    $0x1,%eax
  cltq
L83:
  add    %rax,%rbp
  cmp    %rbx,%r12
  jbe    L122
  cmp    %r13,%rbp
  jae    L122
L357:
  movzbl (%rbx),%edx
  cmp    $0x3f,%dl
  jg     L8
  movzbl 0x0(%rbp),%eax
  cmp    $0x3f,%al
  jg     L116
  movsbq %dl,%rcx
  lea    0x1(%rbx,%rcx,1),%rcx
  cmp    %rcx,%r12
  jb     L42
  movsbq %al,%rcx
  lea    0x1(%rbp,%rcx,1),%rcx
  cmp    %rcx,%r13
  jb     L230
  test   %dl,%dl
  je     L171
  test   %r14d,%r14d
  jne    L141
  test   %al,%al
  jne    L277
  cmp    %rbp,%r15
  je     L141
  lea    0x1(%rbp),%rax
  cmp    %rax,%r15
  jne    L35
  movl   $0x1,0x4(%rsp)
  jmp    L141
L235:
  movl   $0xffffffff,0x4(%rsp)
  jmp    L122
L275:
  movl   $0xffffffff,0x4(%rsp)
  jmp    L122
L113:
  movl   $0xffffffff,0x4(%rsp)
  jmp    L122
L102:
  movl   $0x0,0x4(%rsp)
  jmp    L122
L153:
  movl   $0x0,0x4(%rsp)
  jmp    L122
L8:
  movl   $0xffffffff,0x4(%rsp)
L122:
  mov    0x4(%rsp),%eax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L116:
  movl   $0xffffffff,0x4(%rsp)
  jmp    L122
L42:
  movl   $0xffffffff,0x4(%rsp)
  jmp    L122
L230:
  movl   $0xffffffff,0x4(%rsp)
  jmp    L122
L278:
  movl   $0x1,0x4(%rsp)
  jmp    L141
```

assistant: ```c
int compare_dnsname(const char *s, size_t slen, const char *n, size_t nlen) {
  const char *s0 = s, *n0 = n;
  int done = 0, retcode = 0;
  if (slen < 1 || nlen < 1)
    return -1;
  if (slen == nlen && memcmp(s, n, slen) == 0)
    return 0;
  if (*(s0 + slen - 1) || *(n0 + nlen - 1))
    return -1;
  while (s < s0 + slen && n < n0 + nlen) {
    if (*s >= 0x40 || *n >= 0x40)
      return -1;
    if (s + *s + 1 > s0 + slen || n + *n + 1 > n0 + nlen)
      return -1;
    if (*s == '\0') {
      if (s == s0 + slen - 1)
        break;
      else if (s + 1 == s0 + slen - 1)
        return retcode;
      else
        return -1;
    }
    if (!done) {
      if (*n == '\0') {
        if (n == n0 + nlen - 1) {
          done = 1;
        } else if (n + 1 == n0 + nlen - 1) {
          retcode = 1;
          done = 1;
        } else
          return -1;
      } else {
        if (*s != *n) {
          done = 1;
          retcode = 1;
        } else {
          if (memcmp(s + 1, n + 1, *s)) {
            done = 1;
            retcode = 1;
          }
        }
      }
    }
    s += *s + 1;
    n += done ? 0 : (*n + 1);
  }
  return retcode;
}
```