user: Please show me the C implementation that matches the assembly code listed below:

```asm
<combinationSum>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %esi,-0x7c(%rbp)
  mov    %edx,-0x80(%rbp)
  mov    %rcx,-0x88(%rbp)
  mov    %r8,-0x90(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x800,%edi
  call   <malloc@plt>
  mov    %rax,-0x58(%rbp)
  mov    $0x400,%edi
  call   <malloc@plt>
  mov    %rax,%rdx
  mov    -0x88(%rbp),%rax
  mov    %rdx,(%rax)
  movl   $0x0,-0x64(%rbp)
  jmp    L18
L17:
  mov    $0x40,%edi
  call   <malloc@plt>
  mov    -0x64(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x58(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rax,(%rdx)
  mov    -0x64(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x64(%rbp)
L18:
  mov    -0x64(%rbp),%eax
  cmp    $0xff,%eax
  jle    L17
  movl   $0x0,-0x64(%rbp)
  jmp    L74
L37:
  mov    -0x64(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x60(%rbp)
  jmp    L4
L39:
  mov    -0x64(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x60(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x78(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jle    L49
  mov    -0x64(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x5c(%rbp)
  mov    -0x60(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    -0x64(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x78(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x60(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rax,%rdx
  mov    -0x5c(%rbp),%eax
  mov    %eax,(%rdx)
L49:
  addl   $0x1,-0x60(%rbp)
L4:
  mov    -0x60(%rbp),%eax
  cmp    -0x7c(%rbp),%eax
  jl     L39
  mov    -0x64(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x64(%rbp)
L74:
  mov    -0x7c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x64(%rbp),%eax
  cmp    %eax,%edx
  jg     L37
  movl   $0x0,-0x64(%rbp)
  lea    -0x64(%rbp),%r8
  mov    -0x88(%rbp),%rdi
  mov    -0x80(%rbp),%ecx
  mov    -0x7c(%rbp),%edx
  mov    -0x78(%rbp),%rax
  lea    -0x50(%rbp),%rsi
  push   %rsi
  push   $0x0
  push   -0x58(%rbp)
  push   -0x90(%rbp)
  mov    %r8,%r9
  mov    %rdi,%r8
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <dfs@plt>
  add    $0x20,%rsp
  mov    -0x58(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L44
  call   <__stack_chk_fail@plt>
L44:
  leave
  ret
```

assistant: ```c
int **combinationSum(int *candidates, int candidatesSize, int target, int **columnSizes, int *returnSize) {
  int i, j;
  int a[16];
  int **ret = (int **)malloc(sizeof(int *) * 256);
  *columnSizes = (int *)malloc(sizeof(int) * 256);
  for (i = 0; i < 256; i++) {
    ret[i] = (int *)malloc(sizeof(int) * 16);
  }
  for (i = 0; i < candidatesSize - 1; i++) {
    for (j = i + 1; j < candidatesSize; j++) {
      if (candidates[i] > candidates[j]) {
        int tmp = candidates[i];
        candidates[i] = candidates[j];
        candidates[j] = tmp;
      }
    }
  }
  i = 0;
  dfs(candidates, 0, candidatesSize, target, columnSizes, &i, returnSize, ret, 0, a);
  return ret;
}
```