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

```asm
<allocate_matrix>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x448,%rsp
  mov    %edi,-0x444(%rbp)
  mov    %esi,-0x448(%rbp)
  mov    %rdx,-0x450(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x444(%rbp),%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x428(%rbp)
  cmpq   $0x0,-0x428(%rbp)
  jne    L78
  lea    D27(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L78:
  movl   $0x0,-0x43c(%rbp)
  jmp    L40
L25:
  mov    -0x448(%rbp),%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edx
  mov    -0x43c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x428(%rbp),%rax
  lea    (%rcx,%rax,1),%rbx
  mov    %edx,%edi
  call   <malloc@plt>
  mov    %rax,(%rbx)
  mov    -0x43c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x428(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L35
  lea    D27(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L117
L35:
  addl   $0x1,-0x43c(%rbp)
L40:
  mov    -0x43c(%rbp),%eax
  cmp    -0x444(%rbp),%eax
  jl     L25
L117:
  mov    -0x450(%rbp),%rax
  mov    %rax,%rdi
  call   <rewind@plt>
  movl   $0x0,-0x434(%rbp)
  mov    -0x434(%rbp),%eax
  mov    %eax,-0x438(%rbp)
  jmp    L22
L7:
  movq   $0x0,-0x430(%rbp)
  jmp    L80
L90:
  mov    -0x438(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x428(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x434(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    (%rdx,%rax,1),%rbx
  mov    -0x430(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,(%rbx)
  mov    -0x434(%rbp),%eax
  add    $0x1,%eax
  cltd
  idivl  -0x448(%rbp)
  mov    %edx,-0x434(%rbp)
L80:
  cmpq   $0x0,-0x430(%rbp)
  jne    L8
  lea    -0x420(%rbp),%rax
  jmp    L11
L8:
  mov    $0x0,%eax
L11:
  lea    D14(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  mov    %rax,-0x430(%rbp)
  cmpq   $0x0,-0x430(%rbp)
  jne    L90
  addl   $0x1,-0x438(%rbp)
L22:
  mov    -0x450(%rbp),%rdx
  lea    -0x420(%rbp),%rax
  mov    $0x400,%esi
  mov    %rax,%rdi
  call   <fgets@plt>
  test   %rax,%rax
  jne    L7
  mov    -0x450(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  mov    -0x428(%rbp),%rax
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L96
  call   <__stack_chk_fail@plt>
L96:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D27
data_type: string
name: parse_data
arguments: data_tag: D14
data_type: string

tool: D27: ERROR: out of memory


tool: D14: ,

assistant: ```c
int **allocate_matrix(int rowMaxIndex, int columnMaxIndex, FILE *fp) {
  int idx;
  int **mat;
  int i, j;
  char part[1024];
  char *token;
  mat = malloc(sizeof(int *) * rowMaxIndex);
  if (mat == NULL) {
    printf("ERROR: out of memory\n");
  }
  for (idx = 0; idx < rowMaxIndex; idx++) {
    mat[idx] = malloc(sizeof(int *) * columnMaxIndex);
    if (mat[idx] == NULL) {
      printf("ERROR: out of memory\n");
      break;
    }
  }
  rewind(fp);
  i = j = 0;
  while (fgets(part, 1024, fp) != NULL) {
    token = NULL;
    while ((token = strtok((token == NULL) ? part : NULL, ",")) != NULL) {
      mat[i][j] = atoi(token);
      j = (j + 1) % columnMaxIndex;
    }
    i++;
  }
  fclose(fp);
  return mat;
}
```