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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  movl   $0xb4,-0x24(%rbp)
  movl   $0x219,-0x20(%rbp)
  movl   $0x25,-0x1c(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <acc_malloc@plt>
  cltq
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <assert@plt>
  movl   $0x0,-0x30(%rbp)
  jmp    L61
L1:
  mov    -0x24(%rbp),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_map_data@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_is_present@plt>
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  cmpl   $0x0,-0x30(%rbp)
  jne    L50
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <memset@plt>
L50:
  mov    -0x24(%rbp),%eax
  lea    -0x4d(%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_create@plt>
  cltq
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%rax
  add    $0x3,%rax
  cmp    %rax,-0x8(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_create@plt>
  cltq
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_is_present@plt>
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_unmap_data@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_is_present@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  movl   $0x0,-0x2c(%rbp)
  jmp    L40
L24:
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  mov    -0x30(%rbp),%eax
  mov    %eax,%esi
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    %esi,%eax
  imul   %edx,%eax
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x10(%rbp),%rax
  add    %rsi,%rax
  add    %ecx,%edx
  mov    %dl,(%rax)
  addl   $0x1,-0x2c(%rbp)
L40:
  mov    -0x2c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L24
  addl   $0x1,-0x30(%rbp)
L61:
  mov    -0x30(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jl     L1
  mov    -0x24(%rbp),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_memcpy_from_device@plt>
  movl   $0x0,-0x28(%rbp)
  jmp    L9
L3:
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x20(%rbp),%eax
  sub    $0x1,%eax
  imul   -0x20(%rbp),%eax
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %ecx,%eax
  sar    %eax
  imul   -0x28(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x1c(%rbp),%eax
  add    %ecx,%eax
  mov    %eax,%ecx
  sar    $0x1f,%ecx
  shr    $0x18,%ecx
  add    %ecx,%eax
  movzbl %al,%eax
  sub    %ecx,%eax
  cmp    %eax,%edx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  addl   $0x1,-0x28(%rbp)
L9:
  mov    -0x28(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L3
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <acc_free@plt>
  mov    $0x0,%eax
  leave
  ret
```

assistant: ```c
int main() {
  const int N = 180;
  const int N_i = 537;
  const int C = 37;
  unsigned char *h = (unsigned char *)malloc(N);
  assert(h);
  unsigned char *d = (unsigned char *)acc_malloc(N);
  assert(d);
  for (int i = 0; i < N_i; ++i) {
    acc_map_data(h, d, N);
    assert(acc_is_present(h, N));
#pragma acc parallel present(h [0:N])
    {
      if (i == 0)
        memset(h, C, N);
    }
    unsigned char *d_ = (unsigned char *)acc_create(h + 3, N - 77);
    assert(d_ == d + 3);
#pragma acc data create(h [6:N - 44])
    {
      d_ = (unsigned char *)acc_create(h, N);
      assert(d_ == d);
#pragma acc enter data create(h [0:N])
      assert(acc_is_present(h, N));
      acc_unmap_data(h);
      assert(!acc_is_present(h, N));
    }
#pragma acc parallel loop deviceptr(d)
    for (int j = 0; j < N; ++j)
      d[j] += i * j;
  }
  acc_memcpy_from_device(h, d, N);
  for (int j = 0; j < N; ++j)
    assert(h[j] == ((C + N_i * (N_i - 1) / 2 * j) % 256));
  acc_free(d);
  return 0;
}
```