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

```asm
<fqdn_read>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r12
  push   %rbx
  sub    $0xc0,%rsp
  mov    %rdi,-0xc8(%rbp)
  mov    %rsi,-0xd0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0xb0(%rbp)
  mov    $0x0,%r12d
  mov    $0x0,%ebx
  mov    $0x4,%edi
  mov    $0x0,%eax
  call   <alloc@plt>
  cltq
  mov    %rax,-0xa8(%rbp)
  mov    -0xa8(%rbp),%rax
  mov    $0x4,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <byte_zero@plt>
  mov    -0xa8(%rbp),%rax
  movl   $0xff,(%rax)
  mov    -0xa8(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0xac(%rbp)
  mov    -0xd0(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L164
  mov    -0xc8(%rbp),%rax
  movb   $0x2e,(%rax)
  movl   $0xffffffff,-0xa0(%rbp)
  mov    -0xa8(%rbp),%rax
  movl   $0x1,(%rax)
  mov    -0xc8(%rbp),%rax
  jmp    L157
L164:
  movl   $0x0,-0xa0(%rbp)
L149:
  mov    -0xd0(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0xd0(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xb2(%rbp)
  movsbl -0xb2(%rbp),%eax
  add    %eax,-0xb0(%rbp)
  mov    -0xb0(%rbp),%eax
  cmp    -0xac(%rbp),%eax
  jl     L185
  mov    $0x0,%eax
  jmp    L157
L5:
  mov    -0xd0(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0xd0(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xb1(%rbp)
  cmpb   $0x40,-0xb1(%rbp)
  jle    L26
  cmpb   $0x5a,-0xb1(%rbp)
  jg     L26
  movzbl -0xb1(%rbp),%eax
  add    $0x20,%eax
  mov    %al,-0xb1(%rbp)
L26:
  cmpb   $0x60,-0xb1(%rbp)
  jle    L178
  cmpb   $0x7a,-0xb1(%rbp)
  jle    L62
L178:
  cmpb   $0x2f,-0xb1(%rbp)
  jle    L84
  cmpb   $0x39,-0xb1(%rbp)
  jle    L62
L84:
  cmpb   $0x2d,-0xb1(%rbp)
  je     L62
  cmpb   $0x5f,-0xb1(%rbp)
  jne    L130
L62:
  mov    %ebx,%eax
  lea    0x1(%rax),%ebx
  movslq %eax,%rdx
  mov    -0xc8(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xb1(%rbp),%eax
  mov    %al,(%rdx)
  jmp    L185
L130:
  movslq %ebx,%rdx
  mov    -0xc8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x5c,(%rax)
  add    $0x1,%ebx
  movzbl -0xb1(%rbp),%eax
  sar    $0x6,%al
  and    $0x7,%eax
  lea    0x30(%rax),%edx
  movslq %ebx,%rax
  lea    0x1(%rax),%rcx
  mov    -0xc8(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  movzbl -0xb1(%rbp),%eax
  sar    $0x3,%al
  and    $0x7,%eax
  lea    0x30(%rax),%edx
  movslq %ebx,%rax
  lea    0x2(%rax),%rcx
  mov    -0xc8(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  movzbl -0xb1(%rbp),%eax
  and    $0x7,%eax
  lea    0x30(%rax),%edx
  movslq %ebx,%rax
  lea    0x3(%rax),%rcx
  mov    -0xc8(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  add    $0x4,%ebx
L185:
  movzbl -0xb2(%rbp),%eax
  mov    %eax,%edx
  sub    $0x1,%edx
  mov    %dl,-0xb2(%rbp)
  test   %al,%al
  jne    L5
  mov    -0xd0(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L99
  mov    %ebx,%eax
  lea    0x1(%rax),%ebx
  movslq %eax,%rdx
  mov    -0xc8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x2e,(%rax)
  add    $0x1,%r12d
  cmp    $0x20,%r12d
  je     L46
  movslq %r12d,%rax
  mov    %ebx,-0xa0(%rbp,%rax,4)
  addl   $0x1,-0xb0(%rbp)
  jmp    L149
L99:
  nop
  jmp    L15
L46:
  nop
L15:
  movslq %ebx,%rdx
  mov    -0xc8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0xa8(%rbp),%rax
  mov    -0xb0(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0xc8(%rbp),%rax
L157:
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L116
  call   <__stack_chk_fail@plt>
L116:
  add    $0xc0,%rsp
  pop    %rbx
  pop    %r12
  pop    %rbp
  ret
```

assistant: ```c
char *fqdn_read(out, q)
char *out;
const char *q;
{
  int *len;
  int label_idx[32];
  char ch;
  int maxlen;
  char ch2;
  int cur_len = 0;
  register int i = 0;
  register int j = 0;
  len = alloc(4);
  byte_zero(len, 4);
  *len = 255;
  maxlen = *len;
  if (!*q) {
    out[0] = '.';
    label_idx[0] = -1;
    *len = 1;
    return out;
  } else {
    label_idx[0] = 0;
    for (;;) {
      ch = *q++;
      cur_len += ch;
      if (cur_len >= maxlen)
        return (char *)0;
      while (ch--) {
        ch2 = *q++;
        if ((ch2 >= 'A') && (ch2 <= 'Z'))
          ch2 += 32;
        if (((ch2 >= 'a') && (ch2 <= 'z')) || ((ch2 >= '0') && (ch2 <= '9')) || (ch2 == '-') || (ch2 == '_')) {
          out[j++] = ch2;
        } else {
          out[j] = '\\';
          j++;
          out[j + 1] = '0' + ((ch2 >> 6) & 7);
          out[j + 2] = '0' + ((ch2 >> 3) & 7);
          out[j + 3] = '0' + (ch2 & 7);
          j += 4;
        }
      }
      if (!*q)
        break;
      out[j++] = '.';
      i += 1;
      if (i == 32)
        break;
      label_idx[i] = j;
      cur_len += 1;
    }
  }
  out[j] = '\0';
  *len = cur_len;
  return out;
}
```