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

```asm
<split_string>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %esi,%r12d
  movzbl (%rdi),%eax
  cmp    $0x20,%al
  je     L20
  cmp    $0x9,%al
  jne    L341
L20:
  mov    %rbx,%rax
L71:
  add    $0x1,%rax
  movzbl (%rax),%edx
  cmp    $0x20,%dl
  je     L71
  cmp    $0x9,%dl
  je     L71
L74:
  mov    $0x0,%ebp
  cmpb   $0x0,(%rax)
  jne    L148
L48:
  lea    0x8(,%rbp,8),%edi
  call   <smalloc@plt>
  mov    %rax,%r14
  movslq %ebp,%rbp
  movq   $0x0,(%rax,%rbp,8)
  movzbl (%rbx),%eax
  cmp    $0x20,%al
  je     L185
  cmp    $0x9,%al
  jne    L136
L185:
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  cmp    $0x20,%al
  je     L185
  cmp    $0x9,%al
  je     L185
L136:
  cmpb   $0x0,(%rbx)
  je     L5
  mov    %r14,%r13
  jmp    L280
L341:
  mov    %rdi,%rax
  jmp    L74
L196:
  add    $0x1,%rax
  movzbl (%rax),%edx
  cmp    $0x20,%dl
  je     L196
  cmp    $0x9,%dl
  je     L196
L319:
  cmpb   $0x0,(%rax)
  je     L48
L148:
  movzbl (%rax),%edx
  test   $0xdf,%dl
  je     L224
  cmp    $0x9,%dl
  je     L224
L219:
  add    $0x1,%rax
  movzbl (%rax),%edx
  test   $0xdf,%dl
  je     L224
  cmp    $0x9,%dl
  jne    L219
L224:
  add    $0x1,%ebp
  movzbl (%rax),%edx
  cmp    $0x20,%dl
  je     L196
  cmp    $0x9,%dl
  je     L196
  jmp    L319
L277:
  mov    %ebp,%esi
  sub    %ebx,%esi
  mov    %rbx,%rdi
  call   <string_ndup@plt>
  mov    %rax,0x0(%r13)
  lea    0x1(%rbp),%rbx
  cmpb   $0x0,0x0(%rbp)
  jne    L131
L24:
  mov    %rbp,%rbx
  jmp    L234
L131:
  movzbl (%rbx),%eax
  cmp    $0x20,%al
  je     L145
  cmp    $0x9,%al
  jne    L234
L145:
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  cmp    $0x20,%al
  je     L145
  cmp    $0x9,%al
  je     L145
L234:
  add    $0x8,%r13
  cmpb   $0x0,(%rbx)
  je     L5
L280:
  movzbl (%rbx),%eax
  test   $0xdf,%al
  je     L98
  mov    %rbx,%rbp
  cmp    $0x9,%al
  je     L98
L369:
  add    $0x1,%rbp
  movzbl 0x0(%rbp),%eax
  test   $0xdf,%al
  je     L309
  cmp    $0x9,%al
  jne    L369
L309:
  test   %r12d,%r12d
  jne    L277
  mov    %rbx,0x0(%r13)
  cmpb   $0x0,0x0(%rbp)
  je     L24
  movb   $0x0,0x0(%rbp)
  lea    0x1(%rbp),%rbx
  jmp    L131
L98:
  mov    %rbx,%rbp
  jmp    L309
L5:
  mov    %r14,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

assistant: ```c
char **split_string(char *str, int copy) {
  char **bits;
  int nbits;
  char *ch, *start;
  for (ch = str; (*ch == ' ') || (*ch == '\t'); ch++)
    ;
  for (nbits = 0; *ch != '\0';) {
    for (; (*ch != '\0') && (*ch != ' ') && (*ch != '\t'); ch++)
      ;
    nbits++;
    for (; (*ch == ' ') || (*ch == '\t'); ch++)
      ;
  }
  bits = (char **)smalloc((nbits + 1) * sizeof(char *));
  bits[nbits] = NULL;
  for (ch = str; (*ch == ' ') || (*ch == '\t'); ch++)
    ;
  for (nbits = 0; *ch != '\0';) {
    start = ch;
    for (; (*ch != '\0') && (*ch != ' ') && (*ch != '\t'); ch++)
      ;
    if (copy) {
      bits[nbits] = string_ndup(start, (int)(ch - start));
      if (*ch != '\0') {
        ch++;
      }
    } else {
      bits[nbits] = start;
      if (*ch != '\0') {
        *ch = '\0';
        ch++;
      }
    }
    nbits++;
    for (; (*ch == ' ') || (*ch == '\t'); ch++)
      ;
  }
  return bits;
}
```