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

```asm
<poptParseArgvString>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rbp
  mov    %rsi,0x10(%rsp)
  mov    %rdx,0x18(%rsp)
  call   <strlen@plt>
  lea    0x1(%rax),%rdi
  call   <malloc@plt>
  mov    %rax,%rdi
  mov    %rbp,%rsi
  call   <strcpy@plt>
  mov    %rax,%r15
  mov    %rax,(%rsp)
  mov    $0x28,%edi
  call   <malloc@plt>
  mov    %rax,%r14
  mov    %r15,(%rax)
  mov    %rbp,%rdi
  call   <strlen@plt>
  lea    0x1(%rax),%rdx
  mov    $0x0,%esi
  mov    %r15,%rdi
  call   <memset@plt>
  movzbl 0x0(%rbp),%ebx
  test   %bl,%bl
  je     L172
  mov    %r15,%r13
  mov    $0x0,%r15d
  movl   $0x5,0xc(%rsp)
  mov    $0x0,%r12d
  jmp    L140
L149:
  lea    0x1(%rbp),%rdx
  movzbl 0x1(%rbp),%eax
  test   %al,%al
  je     L218
  mov    %rdx,%rbp
  cmp    %r12b,%al
  je     L115
  movb   $0x5c,0x0(%r13)
  lea    0x1(%r13),%r13
  jmp    L115
L218:
  mov    %r14,%rdi
  call   <free@plt>
  mov    $0xfffffff1,%eax
  jmp    L136
L125:
  movsbl %bl,%edi
  call   <isspace@plt>
  test   %eax,%eax
  je     L248
  movslq %r15d,%rax
  lea    0x0(,%rax,8),%rbx
  mov    (%r14,%rax,8),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L127
  add    $0x1,%r13
  add    $0x1,%r15d
  cmp    0xc(%rsp),%r15d
  je     L243
L235:
  mov    %r13,0x8(%r14,%rbx,1)
  mov    %rbp,%rax
  jmp    L255
L243:
  addl   $0x5,0xc(%rsp)
  mov    0xc(%rsp),%eax
  movslq %eax,%rsi
  shl    $0x3,%rsi
  mov    %r14,%rdi
  call   <realloc@plt>
  mov    %rax,%r14
  jmp    L235
L248:
  cmp    $0x27,%bl
  je     L287
  cmp    $0x5c,%bl
  je     L26
  cmp    $0x22,%bl
  je     L275
L169:
  movzbl 0x0(%rbp),%eax
  mov    %al,0x0(%r13)
  mov    %rbp,%rax
  lea    0x1(%r13),%r13
  jmp    L255
L26:
  lea    0x1(%rbp),%rax
  cmpb   $0x0,0x1(%rbp)
  je     L185
  mov    %rax,%rbp
  jmp    L169
L185:
  mov    %r14,%rdi
  call   <free@plt>
  mov    $0xfffffff1,%eax
  jmp    L136
L150:
  mov    %rbp,%rax
  mov    $0x0,%r12d
L255:
  lea    0x1(%rax),%rbp
  movzbl 0x1(%rax),%ebx
  test   %bl,%bl
  je     L68
L140:
  cmp    %r12b,%bl
  je     L150
  test   %r12b,%r12b
  je     L125
  cmp    $0x5c,%bl
  je     L149
L115:
  movzbl 0x0(%rbp),%eax
  mov    %al,0x0(%r13)
  mov    %rbp,%rax
  lea    0x1(%r13),%r13
  jmp    L255
L127:
  mov    %eax,%r12d
  mov    %rbp,%rax
  jmp    L255
L287:
  mov    %ebx,%r12d
  mov    %rbp,%rax
  jmp    L255
L275:
  mov    %ebx,%r12d
  mov    %rbp,%rax
  jmp    L255
L172:
  mov    (%rsp),%r13
  mov    $0x0,%r15d
L68:
  movslq %r15d,%rax
  mov    (%r14,%rax,8),%rax
  cmpb   $0x0,(%rax)
  je     L45
  add    $0x1,%r15d
  add    $0x1,%r13
L45:
  movslq %r15d,%rbp
  shl    $0x3,%rbp
  sub    (%rsp),%r13
  lea    0x0(%rbp,%r13,1),%rdi
  call   <malloc@plt>
  mov    %rax,%rbx
  lea    (%rax,%rbp,1),%r12
  mov    %rbp,%rdx
  mov    %r14,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    %r13,%rdx
  mov    (%rsp),%rsi
  mov    %r12,%rdi
  call   <memcpy@plt>
  test   %r15d,%r15d
  jle    L159
  mov    %r15d,%ecx
  mov    $0x0,%eax
L278:
  mov    %r12,%rdx
  add    (%r14,%rax,8),%rdx
  sub    (%rsp),%rdx
  mov    %rdx,(%rbx,%rax,8)
  add    $0x1,%rax
  cmp    %rcx,%rax
  jne    L278
L159:
  mov    %r14,%rdi
  call   <free@plt>
  mov    0x18(%rsp),%rax
  mov    %rbx,(%rax)
  mov    0x10(%rsp),%rax
  mov    %r15d,(%rax)
  mov    $0x0,%eax
L136:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int poptParseArgvString(char *s, int *argcPtr, char ***argvPtr) {
  char *buf = strcpy(malloc(strlen(s) + 1), s);
  char *bufStart = buf;
  char *src, *dst;
  char quote = '\0';
  int argvAlloced = 5;
  char **argv = malloc(sizeof(*argv) * argvAlloced);
  char **argv2;
  int argc = 0;
  int i;
  src = s;
  dst = buf;
  argv[argc] = buf;
  memset(buf, '\0', strlen(s) + 1);
  while (*src) {
    if (quote == *src) {
      quote = '\0';
    } else if (quote) {
      if (*src == '\\') {
        src++;
        if (!*src) {
          free(argv);
          return -15;
        }
        if (*src != quote)
          *buf++ = '\\';
      }
      *buf++ = *src;
    } else if (isspace(*src)) {
      if (*argv[argc]) {
        buf++, argc++;
        if (argc == argvAlloced) {
          argvAlloced += 5;
          argv = realloc(argv, sizeof(*argv) * argvAlloced);
        }
        argv[argc] = buf;
      }
    } else
      switch (*src) {
      case '"':
      case '\'':
        quote = *src;
        break;
      case '\\':
        src++;
        if (!*src) {
          free(argv);
          return -15;
        }
      default:
        *buf++ = *src;
      }
    src++;
  }
  if (strlen(argv[argc])) {
    argc++, buf++;
  }
  dst = malloc(argc * sizeof(*argv) + (buf - bufStart));
  argv2 = (void *)dst;
  dst += argc * sizeof(*argv);
  memcpy(argv2, argv, argc * sizeof(*argv));
  memcpy(dst, bufStart, buf - bufStart);
  for (i = 0; i < argc; i++) {
    argv2[i] = dst + (argv[i] - bufStart);
  }
  free(argv);
  *argvPtr = argv2;
  *argcPtr = argc;
  return 0;
}
```