user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  movl   $0x1312d00,-0x38(%rbp)
  mov    $0x4,%esi
  mov    $0x1312d00,%edi
  call   <calloc@plt>
  mov    %rax,-0x28(%rbp)
  mov    $0x4,%esi
  mov    $0x1312d00,%edi
  call   <calloc@plt>
  mov    %rax,-0x20(%rbp)
  movl   $0x0,-0x44(%rbp)
  jmp    L25
L4:
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movl   $0x1,(%rax)
  mov    -0x44(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x28(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x44(%rbp)
L25:
  mov    -0x44(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  jl     L4
  mov    $0x0,%eax
  call   <omp_get_wtime@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x18(%rbp)
  mov    $0x0,%eax
  call   <omp_get_thread_num@plt>
  mov    %eax,-0x34(%rbp)
  mov    $0x0,%eax
  call   <omp_get_num_threads@plt>
  mov    %eax,-0x30(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  jne    L30
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x30(%rbp),%xmm1
  movq   %xmm1,%rdx
  mov    -0x38(%rbp),%eax
  movq   %rdx,%xmm0
  mov    %eax,%esi
  lea    D19(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L30:
  mov    -0x34(%rbp),%eax
  imul   -0x38(%rbp),%eax
  cltd
  idivl  -0x30(%rbp)
  mov    %eax,-0x2c(%rbp)
  mov    -0x34(%rbp),%eax
  add    $0x1,%eax
  imul   -0x38(%rbp),%eax
  cltd
  idivl  -0x30(%rbp)
  mov    %eax,-0x3c(%rbp)
  mov    -0x30(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x34(%rbp)
  jne    L7
  mov    -0x38(%rbp),%eax
  mov    %eax,-0x3c(%rbp)
L7:
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x40(%rbp)
  jmp    L24
L58:
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ecx
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  add    %ecx,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x40(%rbp)
L24:
  mov    -0x40(%rbp),%eax
  cmp    -0x3c(%rbp),%eax
  jl     L58
  mov    $0x0,%eax
  call   <omp_get_wtime@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  subsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    -0x38(%rbp),%eax
  movq   %rdx,%xmm0
  mov    %eax,%esi
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D19
type: string
name: extract_symbolic_data
arguments: data_tag: D13
type: string

tool: D19: Soma de %d numeros com %d threads


tool: D13: Soma de %d numeros em tempo: %.4f segundos.


assistant: ```c
int main(void) {
  int N = 20000000;
  double t0, t1, tdelta;
  int *a, *b;
  int i;
  a = (int *)calloc(20000000, sizeof(int));
  b = (int *)calloc(20000000, sizeof(int));
  for (i = 0; i < N; i++) {
    a[i] = b[i] = 1;
  }
  t0 = omp_get_wtime();
#pragma omp parallel
  {
    int id, i, nthreads, istart, iend;
    id = omp_get_thread_num();
    nthreads = omp_get_num_threads();
    if (id == 0)
      printf("Soma de %d numeros com %d threads\n", N, nthreads);
    istart = id * N / nthreads;
    iend = (id + 1) * N / nthreads;
    if (id == nthreads - 1)
      iend = N;
    for (i = istart; i < iend; i++)
      a[i] = a[i] + b[i];
  }
  t1 = omp_get_wtime();
  tdelta = t1 - t0;
  printf("Soma de %d numeros em tempo: %.4f segundos.\n", N, tdelta);
  return 0;
}
```