user: 提供的汇编代码用C语言表示会是什么样子:

```asm
<bc_str_split>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %sil,0xf(%rsp)
  test   %rdi,%rdi
  je     L95
  mov    %rdi,%rbx
  mov    $0x8,%edi
  mov    %rdx,%r13
  call   <bc_malloc@plt>
  mov    %rax,%rbp
  test   %r13,%r13
  je     L42
  movq   $0x0,0x10(%rsp)
  xor    %r14d,%r14d
  xor    %r15d,%r15d
  mov    $0x1,%r12d
  nopl   (%rax)
L36:
  mov    %rbx,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  cltq
  cmp    %r14,%rax
  jbe    L63
  cmpb   $0x0,(%rbx)
  je     L63
  movzbl (%rbx,%r14,1),%eax
  cmp    %al,0xf(%rsp)
  je     L71
L44:
  test   %al,%al
  je     L134
  add    $0x1,%r14
  jmp    L36
  nopl   0x0(%rax)
L42:
  movq   $0x0,0x10(%rsp)
  xor    %r15d,%r15d
  mov    $0x1,%r12d
  nopw   0x0(%rax,%rax,1)
L53:
  mov    %rbx,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  cltq
  cmp    %r13,%rax
  jbe    L63
  cmpb   $0x0,(%rbx)
  je     L63
  movzbl (%rbx,%r13,1),%eax
  cmp    0xf(%rsp),%al
  je     L12
  test   %al,%al
  je     L12
  add    $0x1,%r13
  jmp    L53
  nopl   0x0(%rax)
L12:
  lea    0x0(,%r12,8),%r15
  mov    %rbp,%rdi
  mov    %r13,%r14
  mov    %r15,%rsi
  call   <bc_realloc@plt>
  sub    0x10(%rsp),%r14
  lea    0x1(%r14),%rdi
  lea    -0x8(%rax,%r15,1),%r15
  mov    %rax,%rbp
  call   <bc_malloc@plt>
  mov    0x10(%rsp),%rsi
  mov    %r14,%rdx
  mov    %rax,(%r15)
  mov    %rax,%rdi
  add    %rbx,%rsi
  call   <memcpy@plt>
  mov    (%r15),%rax
  mov    %r12,%r15
  add    $0x1,%r12
  movb   $0x0,(%rax,%r14,1)
  lea    0x1(%r13),%rax
  mov    %rax,0x10(%rsp)
  mov    %rax,%r13
  jmp    L53
  nopw   0x0(%rax,%rax,1)
L71:
  cmp    %r12,%r13
  jbe    L44
  nopl   0x0(%rax)
L134:
  lea    0x0(,%r12,8),%rcx
  mov    %rbp,%rdi
  mov    %r14,%r15
  mov    %rcx,%rsi
  mov    %rcx,0x18(%rsp)
  call   <bc_realloc@plt>
  mov    0x18(%rsp),%rcx
  sub    0x10(%rsp),%r15
  lea    0x1(%r15),%rdi
  mov    %rax,%rbp
  lea    -0x8(%rax,%rcx,1),%rax
  mov    %rax,0x18(%rsp)
  call   <bc_malloc@plt>
  mov    0x10(%rsp),%rsi
  mov    %r15,%rdx
  mov    %rax,%rdi
  mov    0x18(%rsp),%rax
  add    %rbx,%rsi
  mov    %rdi,(%rax)
  call   <memcpy@plt>
  mov    0x18(%rsp),%rax
  mov    (%rax),%rax
  movb   $0x0,(%rax,%r15,1)
  lea    0x1(%r14),%rax
  mov    %r12,%r15
  add    $0x1,%r12
  mov    %rax,0x10(%rsp)
  mov    %rax,%r14
  jmp    L36
  nopl   0x0(%rax,%rax,1)
L63:
  lea    0x0(,%r12,8),%rsi
  mov    %rbp,%rdi
  call   <bc_realloc@plt>
  movq   $0x0,(%rax,%r15,8)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L95:
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
char **bc_str_split(const char *str, char c, size_t max_pieces) {
  if (str == NULL)
    return NULL;
  char **rv = bc_malloc(sizeof(char *));
  size_t i, start = 0, count = 0;
  for (i = 0; i < strlen(str) + 1; i++) {
    if (str[0] == '\0')
      break;
    if ((str[i] == c && (!max_pieces || count + 1 < max_pieces)) || str[i] == '\0') {
      rv = bc_realloc(rv, (count + 1) * sizeof(char *));
      rv[count] = bc_malloc(i - start + 1);
      memcpy(rv[count], str + start, i - start);
      rv[count++][i - start] = '\0';
      start = i + 1;
    }
  }
  rv = bc_realloc(rv, (count + 1) * sizeof(char *));
  rv[count] = NULL;
  return rv;
}
```