user: 请从给定的汇编指令推导出C源代码:

```asm
<bottom_up>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  mov    %rdx,-0x20(%rbp)
  mov    %rcx,-0x28(%rbp)
  mov    %r8,-0x30(%rbp)
  mov    %r9,-0x38(%rbp)
  movl   $0x1,-0x8(%rbp)
  jmp    L72
L55:
  movl   $0x0,-0x4(%rbp)
  jmp    L66
L34:
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x4(%rbp)
  jl     L10
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  mov    (%rax),%esi
  mov    -0x4(%rbp),%eax
  sub    %esi,%eax
  cltq
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  mov    -0x8(%rbp),%ecx
  movslq %ecx,%rcx
  lea    0x0(,%rcx,8),%rsi
  mov    -0x30(%rbp),%rcx
  add    %rsi,%rcx
  mov    (%rcx),%rsi
  mov    -0x4(%rbp),%ecx
  movslq %ecx,%rcx
  shl    $0x2,%rcx
  add    %rsi,%rcx
  cmp    %eax,%edx
  cmovge %edx,%eax
  mov    %eax,(%rcx)
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  mov    (%rax),%esi
  mov    -0x4(%rbp),%eax
  sub    %esi,%eax
  cltq
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jle    L5
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movl   $0x1,(%rax)
  jmp    L46
L5:
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movl   $0xffffffff,(%rax)
  jmp    L46
L10:
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movl   $0xffffffff,(%rax)
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    -0x8(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x30(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rdx),%rcx
  mov    -0x4(%rbp),%edx
  movslq %edx,%rdx
  shl    $0x2,%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
L46:
  addl   $0x1,-0x4(%rbp)
L66:
  mov    -0x4(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jle    L34
  addl   $0x1,-0x8(%rbp)
L72:
  mov    -0x8(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L55
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  pop    %rbp
  ret
```

assistant: ```c
int bottom_up(int nItems, int size, int *weights, int *values, int **matrix, int **picks) {
  int i, j;
  for (i = 1; i <= nItems; i++) {
    for (j = 0; j <= size; j++) {
      if (weights[i - 1] <= j) {
        matrix[i][j] = (matrix[i - 1][j] > values[i - 1] + matrix[i - 1][j - weights[i - 1]] ? matrix[i - 1][j] : values[i - 1] + matrix[i - 1][j - weights[i - 1]]);
        if (values[i - 1] + matrix[i - 1][j - weights[i - 1]] > matrix[i - 1][j])
          picks[i][j] = 1;
        else
          picks[i][j] = -1;
      } else {
        picks[i][j] = -1;
        matrix[i][j] = matrix[i - 1][j];
      }
    }
  }
  return matrix[nItems][size];
}
```