user: Translate the below assembly code into C programming language:

```asm
<get_cpu_interval>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,-0x54(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x40(%rbp),%rdx
  mov    -0x60(%rbp),%rax
  lea    D13(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strtok_r@plt>
  mov    %rax,-0x30(%rbp)
  cmpl   $0x0,-0x54(%rbp)
  jg     L72
  mov    $0x0,%eax
  jmp    L94
L72:
  mov    -0x54(%rbp),%eax
  cltq
  shl    $0x2,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x28(%rbp)
  movl   $0x0,-0x4c(%rbp)
  jmp    L93
L178:
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movl   $0xffffffff,(%rax)
  addl   $0x1,-0x4c(%rbp)
L93:
  mov    -0x4c(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jl     L178
  cmpq   $0x0,-0x30(%rbp)
  jne    L71
  mov    $0x0,%eax
  jmp    L94
L71:
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x30(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  lea    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    D2(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strtok_r@plt>
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  je     L32
  lea    -0x38(%rbp),%rax
  mov    %rax,%rdx
  lea    D2(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok_r@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  je     L32
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x48(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x44(%rbp)
  mov    -0x48(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jge    L32
  cmpl   $0x0,-0x44(%rbp)
  jle    L32
  cmpl   $0x0,-0x48(%rbp)
  js     L32
  mov    -0x44(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L32
  mov    -0x48(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L32
  mov    -0x44(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L32
  mov    -0x48(%rbp),%eax
  mov    %eax,-0x4c(%rbp)
  jmp    L24
L179:
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movl   $0x1,(%rax)
  addl   $0x1,-0x4c(%rbp)
L24:
  mov    -0x4c(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jle    L179
L32:
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdx
  lea    D13(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok_r@plt>
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  jne    L71
  mov    -0x28(%rbp),%rax
L94:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L171
  call   <__stack_chk_fail@plt>
L171:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D13
data_type: string
name: disassemble_data
arguments: data_tag: D2
data_type: string

tool: D13: ,

tool: D2: -

assistant: ```c
int *get_cpu_interval(int max_cores, char *siblings) {
  int *sibling_array, i;
  char *savep1, *savep2;
  char *tok = strtok_r(siblings, ",", &savep1), *tokcpy;
  int high, low;
  char *interval1, *interval2;
  if (max_cores < 1)
    return NULL;
  sibling_array = malloc(sizeof(int) * max_cores);
  for (i = 0; i < max_cores; i++)
    sibling_array[i] = -1;
  if (tok == NULL)
    return 0;
  do {
    tokcpy = (char *)malloc(sizeof(char) * strlen(tok));
    strcpy(tokcpy, tok);
    interval1 = strtok_r(tokcpy, "-", &savep2);
    if (interval1 != NULL) {
      interval2 = strtok_r(NULL, "-", &savep2);
      if (interval2 != NULL) {
        low = atoi(interval1);
        high = atoi(interval2);
        if (low < high && high > 0 && low >= 0 && high < max_cores && low < max_cores && high < max_cores) {
          for (i = low; i <= high; i++)
            sibling_array[i] = 1;
        }
      }
    }
    tok = strtok_r(NULL, ",", &savep1);
  } while (tok != NULL);
  return sibling_array;
}
```