user: 请从给定的汇编指令推导出C源代码:

```asm
<read_descriptor>:
  endbr64
  movb   $0x0,(%rdx)
  cmpb   $0x2a,(%rdi)
  mov    %rdx,%r8
  jne    L186
  push   %r13
  mov    %rdi,%rax
  mov    %rdx,%r9
  push   %r12
  push   %rbp
  push   %rbx
  jmp    L24
  nopl   0x0(%rax)
L157:
  movslq %edx,%rdx
  add    %rdx,%rax
  cmpb   $0x2a,(%rax)
  jne    L226
L24:
  movsbl 0x3(%rax),%edx
  movzbl (%rsi),%ebx
  add    %edx,%edx
  cmp    %bl,0x1(%rax)
  jne    L157
  movzbl 0x1(%rsi),%ecx
  cmp    %cl,0x2(%rax)
  jne    L157
  lea    -0x5(%rdx),%ecx
  lea    0x4(%rax),%r10
  mov    %ecx,%ebx
  cmp    $0x4,%edx
  je     L8
  lea    0x5(%rax),%r11
  mov    %r9,%rdi
  sub    %r11,%rdi
  cmp    $0xe,%rdi
  jbe    L115
  cmp    $0x6,%ecx
  jbe    L115
  lea    -0x4(%rdx),%r12d
  cmp    $0xe,%ecx
  jbe    L160
  movdqu 0x4(%rax),%xmm0
  mov    %r12d,%edi
  shr    $0x4,%edi
  movups %xmm0,(%r9)
  cmp    $0x1,%edi
  je     L196
  movdqu 0x14(%rax),%xmm1
  movups %xmm1,0x10(%r9)
  cmp    $0x2,%edi
  je     L196
  movdqu 0x24(%rax),%xmm2
  movups %xmm2,0x20(%r9)
  cmp    $0x3,%edi
  je     L196
  movdqu 0x34(%rax),%xmm3
  movups %xmm3,0x30(%r9)
  cmp    $0x4,%edi
  je     L196
  movdqu 0x44(%rax),%xmm4
  movups %xmm4,0x40(%r9)
  cmp    $0x5,%edi
  je     L196
  movdqu 0x54(%rax),%xmm5
  movups %xmm5,0x50(%r9)
  cmp    $0x6,%edi
  je     L196
  movdqu 0x64(%rax),%xmm6
  movups %xmm6,0x60(%r9)
  cmp    $0x7,%edi
  je     L196
  movdqu 0x74(%rax),%xmm7
  movups %xmm7,0x70(%r9)
  cmp    $0x8,%edi
  je     L196
  movdqu 0x84(%rax),%xmm7
  movups %xmm7,0x80(%r9)
  cmp    $0x9,%edi
  je     L196
  movdqu 0x94(%rax),%xmm6
  movups %xmm6,0x90(%r9)
  cmp    $0xa,%edi
  je     L196
  movdqu 0xa4(%rax),%xmm5
  movups %xmm5,0xa0(%r9)
  cmp    $0xb,%edi
  je     L196
  movdqu 0xb4(%rax),%xmm4
  movups %xmm4,0xb0(%r9)
  cmp    $0xc,%edi
  je     L196
  movdqu 0xc4(%rax),%xmm7
  movups %xmm7,0xc0(%r9)
  cmp    $0xd,%edi
  je     L196
  movdqu 0xd4(%rax),%xmm6
  movups %xmm6,0xd0(%r9)
  cmp    $0xe,%edi
  je     L196
  movdqu 0xe4(%rax),%xmm5
  movups %xmm5,0xe0(%r9)
  nopl   (%rax)
L196:
  mov    %r12d,%r13d
  mov    %ecx,%ebx
  and    $0xfffffff0,%r13d
  mov    %r13d,%r11d
  sub    %r13d,%ebx
  lea    (%r10,%r11,1),%rbp
  add    %r9,%r11
  cmp    %r13d,%r12d
  je     L137
L242:
  mov    %edx,%edi
  sub    %r13d,%edi
  lea    -0x4(%rdi),%r12d
  sub    $0x5,%edi
  cmp    $0x6,%edi
  jbe    L219
  mov    %r13d,%edx
  mov    0x4(%rax,%rdx,1),%rax
  mov    %rax,(%r9,%rdx,1)
  mov    %r12d,%eax
  and    $0xfffffff8,%eax
  mov    %eax,%edi
  sub    %eax,%ebx
  add    %rdi,%rbp
  add    %rdi,%r11
  cmp    %eax,%r12d
  je     L137
L219:
  movzbl 0x0(%rbp),%eax
  mov    %al,(%r11)
  test   %ebx,%ebx
  je     L137
  movzbl 0x1(%rbp),%eax
  mov    %al,0x1(%r11)
  cmp    $0x1,%ebx
  je     L137
  movzbl 0x2(%rbp),%eax
  mov    %al,0x2(%r11)
  cmp    $0x2,%ebx
  je     L137
  movzbl 0x3(%rbp),%eax
  mov    %al,0x3(%r11)
  cmp    $0x3,%ebx
  je     L137
  movzbl 0x4(%rbp),%eax
  mov    %al,0x4(%r11)
  cmp    $0x4,%ebx
  je     L137
  movzbl 0x5(%rbp),%eax
  mov    %al,0x5(%r11)
  cmp    $0x5,%ebx
  je     L137
  movzbl 0x6(%rbp),%eax
  mov    %al,0x6(%r11)
L137:
  mov    %ecx,%ecx
  add    $0x1,%rcx
  lea    (%r10,%rcx,1),%rax
  add    %rcx,%r9
L21:
  movb   $0x0,(%r9)
  cmpb   $0x2a,(%rax)
  je     L24
L226:
  pop    %rbx
  mov    %r8,%rax
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L186:
  mov    %rdx,%rax
  ret
L115:
  mov    %ecx,%r11d
  xor    %edx,%edx
  nopl   0x0(%rax)
L147:
  movzbl 0x4(%rax,%rdx,1),%edi
  mov    %dil,(%r9,%rdx,1)
  mov    %rdx,%rdi
  add    $0x1,%rdx
  cmp    %r11,%rdi
  jne    L147
  jmp    L137
L8:
  mov    %r10,%rax
  jmp    L21
L160:
  mov    %r9,%r11
  mov    %r10,%rbp
  xor    %r13d,%r13d
  jmp    L242
```

assistant: ```c
char *read_descriptor(char *vpd, char *name, char *result) {
  char *res_ptr;
  int bytecount;
  res_ptr = result;
  *res_ptr = '\0';
  while (*vpd == '*') {
    if ((vpd[1] == name[0]) && (vpd[2] == name[1])) {
      bytecount = ((int)vpd[3] << 1) - 4;
      vpd += 4;
      while (bytecount--)
        *res_ptr++ = *vpd++;
      *res_ptr = '\0';
    } else
      vpd += ((int)vpd[3] << 1);
  }
  return result;
}
```