user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<parse_line>:
  endbr64
  push   %r15
  lea    -0x1(%rdi),%r15
  push   %r14
  push   %r13
  mov    %rcx,%r13
  push   %r12
  mov    %r8,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    0x60(%rsp),%rax
  mov    %esi,0x14(%rsp)
  mov    %edx,0x10(%rsp)
  mov    %r9,0x18(%rsp)
  movl   $0x0,(%rax)
  movl   $0x0,0xc(%rsp)
  nop
L145:
  mov    %r15,%r14
  nopl   0x0(%rax,%rax,1)
L62:
  mov    %r14,%rbx
  movsbl 0x1(%r14),%edi
  add    $0x1,%r14
  call   <isspace@plt>
  test   %rax,%rax
  jne    L62
  cmpb   $0x0,(%r14)
  je     L283
  mov    0x14(%rsp),%ecx
  cmp    %ecx,0xc(%rsp)
  jge    L226
  addl   $0x1,0xc(%rsp)
  mov    %r14,%r15
  jmp    L168
  nopl   0x0(%rax)
L155:
  cmpb   $0x0,(%r15)
  je     L159
L168:
  movsbl 0x1(%r15),%edi
  add    $0x1,%r15
  call   <isspace@plt>
  test   %rax,%rax
  je     L155
L159:
  mov    0x10(%rsp),%edx
  add    $0x8,%r13
  add    $0x8,%r12
  test   %edx,%edx
  je     L166
  mov    %rbp,-0x8(%r13)
  mov    %r15,%rax
  cmp    %r14,%rbp
  jne    L124
L133:
  mov    %rax,-0x8(%r12)
  lea    0x1(%rax),%rbp
  movb   $0x20,(%rax)
L242:
  cmpb   $0x0,(%r15)
  jne    L145
L283:
  mov    0x10(%rsp),%eax
  test   %eax,%eax
  je     L295
  mov    -0x8(%r12),%rax
  movb   $0x0,(%rax)
L295:
  mov    0x18(%rsp),%rax
  mov    0xc(%rsp),%ecx
  mov    %ecx,(%rax)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L166:
  mov    %r14,-0x8(%r13)
  mov    %r15,-0x8(%r12)
  jmp    L242
  nopl   0x0(%rax,%rax,1)
L124:
  cmp    %r15,%r14
  jae    L257
  mov    %r15,%rsi
  add    $0x2,%rbx
  mov    %rbp,%rdi
  sub    %r14,%rsi
  sub    %rbx,%rdi
  lea    -0x1(%rsi),%rax
  cmp    $0xe,%rdi
  jbe    L285
  cmp    $0x6,%rax
  jbe    L285
  cmp    $0xe,%rax
  jbe    L12
  mov    %rsi,%rdi
  xor    %eax,%eax
  and    $0xfffffffffffffff0,%rdi
  nopl   0x0(%rax)
L55:
  movdqu (%r14,%rax,1),%xmm0
  movups %xmm0,0x0(%rbp,%rax,1)
  add    $0x10,%rax
  cmp    %rdi,%rax
  jne    L55
  mov    %rsi,%r8
  and    $0xfffffffffffffff0,%r8
  lea    0x0(%rbp,%r8,1),%rdi
  lea    (%r14,%r8,1),%rax
  cmp    %r8,%rsi
  je     L61
  mov    %rsi,%r9
  sub    %r8,%r9
  lea    -0x1(%r9),%r10
  cmp    $0x6,%r10
  jbe    L301
L196:
  mov    (%r14,%r8,1),%rdx
  mov    %rdx,0x0(%rbp,%r8,1)
  mov    %r9,%rdx
  and    $0xfffffffffffffff8,%rdx
  add    %rdx,%rdi
  add    %rdx,%rax
  cmp    %rdx,%r9
  je     L61
L301:
  movzbl (%rax),%edx
  mov    %dl,(%rdi)
  lea    0x1(%rax),%rdx
  cmp    %rdx,%r15
  jbe    L61
  movzbl 0x1(%rax),%edx
  mov    %dl,0x1(%rdi)
  lea    0x2(%rax),%rdx
  cmp    %rdx,%r15
  jbe    L61
  movzbl 0x2(%rax),%edx
  mov    %dl,0x2(%rdi)
  lea    0x3(%rax),%rdx
  cmp    %rdx,%r15
  jbe    L61
  movzbl 0x3(%rax),%edx
  mov    %dl,0x3(%rdi)
  lea    0x4(%rax),%rdx
  cmp    %rdx,%r15
  jbe    L61
  movzbl 0x4(%rax),%edx
  mov    %dl,0x4(%rdi)
  lea    0x5(%rax),%rdx
  cmp    %rdx,%r15
  jbe    L61
  movzbl 0x5(%rax),%edx
  mov    %dl,0x5(%rdi)
  lea    0x6(%rax),%rdx
  cmp    %rdx,%r15
  jbe    L61
  movzbl 0x6(%rax),%eax
  mov    %al,0x6(%rdi)
L61:
  lea    0x0(%rbp,%rsi,1),%rax
  jmp    L133
L285:
  xor    %eax,%eax
  nopl   0x0(%rax)
L199:
  movzbl (%r14,%rax,1),%edx
  mov    %dl,0x0(%rbp,%rax,1)
  add    $0x1,%rax
  cmp    %rax,%rsi
  jne    L199
  jmp    L61
L226:
  mov    0x60(%rsp),%rax
  movl   $0x1,(%rax)
  jmp    L283
L257:
  mov    %rbp,%rax
  jmp    L133
L12:
  mov    %rsi,%r9
  mov    %r14,%rax
  mov    %rbp,%rdi
  xor    %r8d,%r8d
  jmp    L196
```

assistant: ```c
void parse_line(char *line, int mwords, int canonize, char **pword_begin, char **pword_end, int *p_nwords, int *p_overflow) {
  char *pl, *psq, *ptmp, *pbegin, *pend;
  int nwords = 0;
  *p_overflow = 0;
  pl = line - 1;
  psq = line;
  do {
    do
      pl++;
    while (isspace(*pl));
    if (*pl == 0)
      break;
    if (nwords >= mwords) {
      *p_overflow = 1;
      break;
    }
    nwords++;
    pbegin = pl;
    do
      pl++;
    while (!isspace(*pl) && *pl != 0);
    pend = pl;
    if (canonize) {
      *pword_begin++ = psq;
      if (psq != pbegin)
        for (ptmp = pbegin; ptmp < pend;)
          *psq++ = *ptmp++;
      else
        psq = pend;
      *pword_end++ = psq;
      *psq++ = ' ';
    } else {
      *pword_begin++ = pbegin;
      *pword_end++ = pend;
    }
  } while (*pl != 0);
  if (canonize)
    **(pword_end - 1) = '\0';
  *p_nwords = nwords;
}
```