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

```asm
<runcmd_cmd2strv>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  movl   $0x0,-0x2c(%rbp)
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x1c(%rbp)
  movl   $0x0,-0x20(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  je     L194
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L194
  cmpq   $0x0,-0x40(%rbp)
  je     L194
  cmpq   $0x0,-0x48(%rbp)
  jne    L49
L194:
  mov    $0xfffffffb,%eax
  jmp    L335
L49:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L66
  mov    $0xfffffffe,%eax
  jmp    L335
L66:
  mov    -0x48(%rbp),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movq   $0x0,(%rax)
  movl   $0x0,-0x24(%rbp)
  jmp    L401
L645:
  mov    -0x24(%rbp),%edx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x7c,%eax
  ja     L188
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D11(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D11(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  cmpl   $0x0,-0x2c(%rbp)
  jne    L9
  mov    -0x48(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <free@plt>
L9:
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movq   $0x0,(%rax)
  mov    -0x40(%rbp),%rax
  mov    -0x2c(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x1c(%rbp),%eax
  jmp    L335
  cmpl   $0x2,-0x20(%rbp)
  jne    L332
  movl   $0x0,-0x20(%rbp)
  mov    -0x28(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x28(%rbp)
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L653
L332:
  mov    -0x20(%rbp),%eax
  and    $0xc,%eax
  test   %eax,%eax
  jne    L261
  jmp    L653
  mov    -0x20(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  jne    L33
  mov    -0x20(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  jne    L33
  mov    -0x20(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L421
  mov    -0x24(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x2d(%rbp)
  movsbl -0x2d(%rbp),%eax
  sub    $0x22,%eax
  cmp    $0x3e,%eax
  seta   %dl
  test   %dl,%dl
  jne    L248
  movabs $0x4400000000000005,%rdx
  mov    %eax,%ecx
  shr    %cl,%rdx
  mov    %rdx,%rax
  and    $0x1,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  je     L248
  orl    $0x20,-0x20(%rbp)
  jmp    L653
L421:
  addl   $0x1,-0x24(%rbp)
  jmp    L33
  mov    -0x20(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  jne    L619
  mov    -0x20(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L231
  andl   $0xfffffffb,-0x20(%rbp)
  jmp    L653
L231:
  cmpl   $0x0,-0x20(%rbp)
  je     L11
  cmpl   $0x2,-0x20(%rbp)
  jne    L480
L11:
  cmpl   $0x0,-0x20(%rbp)
  jne    L364
  mov    -0x28(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x2c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x2c(%rbp)
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
L364:
  movl   $0x6,-0x20(%rbp)
  jmp    L653
L480:
  mov    -0x20(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  jne    L552
  mov    -0x20(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L506
  andl   $0xfffffff7,-0x20(%rbp)
  jmp    L653
L506:
  cmpl   $0x0,-0x20(%rbp)
  je     L591
  cmpl   $0x2,-0x20(%rbp)
  jne    L197
L591:
  cmpl   $0x0,-0x20(%rbp)
  jne    L414
  mov    -0x28(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x2c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x2c(%rbp)
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
L414:
  movl   $0xa,-0x20(%rbp)
  jmp    L653
  mov    -0x20(%rbp),%eax
  and    $0xc,%eax
  test   %eax,%eax
  jne    L283
  orl    $0x1,-0x1c(%rbp)
  jmp    L283
  mov    -0x20(%rbp),%eax
  and    $0xc,%eax
  test   %eax,%eax
  jne    L632
  movl   $0x10,-0x20(%rbp)
  orl    $0x8,-0x1c(%rbp)
  jmp    L632
  mov    -0x20(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  jne    L233
  mov    -0x20(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  jne    L233
  orl    $0x2,-0x1c(%rbp)
  jmp    L233
  mov    -0x20(%rbp),%eax
  and    $0xc,%eax
  test   %eax,%eax
  jne    L560
  orl    $0x4,-0x1c(%rbp)
  jmp    L560
  mov    -0x20(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  jne    L204
  mov    -0x20(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  jne    L204
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L436
  orl    $0x2,-0x1c(%rbp)
  jmp    L204
L436:
  orl    $0x80,-0x1c(%rbp)
  jmp    L204
  mov    -0x20(%rbp),%eax
  and    $0xc,%eax
  test   %eax,%eax
  jne    L598
  orl    $0x40,-0x1c(%rbp)
  jmp    L598
L188:
  nop
  jmp    L33
L261:
  nop
  jmp    L33
L248:
  nop
  jmp    L33
L619:
  nop
  jmp    L33
L552:
  nop
  jmp    L33
L197:
  nop
  jmp    L33
L283:
  nop
  jmp    L33
L632:
  nop
  jmp    L33
L233:
  nop
  jmp    L33
L560:
  nop
  jmp    L33
L204:
  nop
  jmp    L33
L598:
  nop
L33:
  andl   $0xffffffdf,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  jne    L319
  movl   $0x2,-0x20(%rbp)
  mov    -0x28(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x2c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x2c(%rbp)
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
L319:
  mov    -0x24(%rbp),%edx
  mov    -0x38(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x28(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x28(%rbp)
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rax,%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
L653:
  addl   $0x1,-0x24(%rbp)
L401:
  mov    -0x24(%rbp),%eax
  cmp    %rax,-0x18(%rbp)
  ja     L645
  mov    -0x28(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x28(%rbp)
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x20(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L490
  orl    $0x10,-0x1c(%rbp)
L490:
  mov    -0x20(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L252
  orl    $0x20,-0x1c(%rbp)
L252:
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movq   $0x0,(%rax)
  mov    -0x40(%rbp),%rax
  mov    -0x2c(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x1c(%rbp),%eax
L335:
  leave
  ret
```

assistant: ```c
int runcmd_cmd2strv(const char *str, int *out_argc, char **out_argv) {
  int arg = 0;
  int a = 0;
  unsigned int i;
  int state;
  int ret = 0;
  size_t len;
  char *argz;
  (state = 0);
  if (!str || !*str || !out_argc || !out_argv)
    return (-5);
  len = strlen(str);
  argz = malloc(len + 1);
  if (!argz)
    return (-2);
  out_argv[0] = argz;
  out_argv[1] = NULL;
  for (i = 0; i < len; i++) {
    const char *p = &str[i];
    switch (*p) {
    case 0:
      if (arg == 0)
        free(out_argv[0]);
      out_argv[arg] = NULL;
      *out_argc = arg;
      return ret;
    case ' ':
    case '\t':
    case '\r':
    case '\n':
      if ((state == (1 << 1))) {
        (state = 0);
        argz[a++] = 0;
        continue;
      }
      if (!(state & ((1 << 2) | (1 << 3))))
        continue;
      break;
    case '\\':
      if (((state & (1 << 2)) == (1 << 2)) || ((state & (1 << 5)) == (1 << 5))) {
        break;
      }
      if (((state & (1 << 3)) == (1 << 3))) {
        const char next = str[i + 1];
        switch (next) {
        case '"':
        case '\\':
        case '$':
        case '`':
          (state |= (1 << 5));
          continue;
        }
        break;
      }
      i++;
      break;
    case '\'':
      if (((state & (1 << 3)) == (1 << 3)))
        break;
      if (((state & (1 << 2)) == (1 << 2))) {
        (state &= ~(1 << 2));
        continue;
      }
      if ((state == 0) || (state == (1 << 1))) {
        if ((state == 0)) {
          out_argv[arg++] = &argz[a];
        }
        (state = (1 << 2) | (1 << 1));
        continue;
      }
    case '"':
      if (((state & (1 << 2)) == (1 << 2)))
        break;
      if (((state & (1 << 3)) == (1 << 3))) {
        (state &= ~(1 << 3));
        continue;
      }
      if ((state == 0) || (state == (1 << 1))) {
        if ((state == 0)) {
          out_argv[arg++] = &argz[a];
        }
        (state = (1 << 3) | (1 << 1));
        continue;
      }
      break;
    case '|':
    case '<':
    case '>':
      if (!(state & ((1 << 2) | (1 << 3)))) {
        (ret |= (1 << 0));
      }
      break;
    case '&':
    case ';':
      if (!(state & ((1 << 2) | (1 << 3)))) {
        (state = (1 << 4));
        (ret |= (1 << 3));
      }
      break;
    case '`':
      if (!((state & (1 << 2)) == (1 << 2)) && !((state & (1 << 5)) == (1 << 5))) {
        (ret |= (1 << 1));
      }
      break;
    case '(':
    case ')':
      if (!(state & ((1 << 2) | (1 << 3)))) {
        (ret |= (1 << 2));
      }
      break;
    case '$':
      if (!((state & (1 << 2)) == (1 << 2)) && !((state & (1 << 5)) == (1 << 5))) {
        if (p[1] == '(')
          (ret |= (1 << 1));
        else
          (ret |= (1 << 7));
      }
      break;
    case '*':
    case '?':
      if (!(state & ((1 << 2) | (1 << 3)))) {
        (ret |= (1 << 6));
      }
      break;
    default:
      break;
    }
    (state &= ~(1 << 5));
    if ((state == 0)) {
      (state = (1 << 1));
      out_argv[arg++] = &argz[a];
    }
    argz[a++] = str[i];
  }
  argz[a++] = 0;
  if (((state & (1 << 2)) == (1 << 2)))
    (ret |= (1 << 4));
  if (((state & (1 << 3)) == (1 << 3)))
    (ret |= (1 << 5));
  out_argv[arg] = NULL;
  *out_argc = arg;
  return ret;
}
```