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

```asm
<main>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    $0xb4,%edi
  call   <malloc@plt>
  mov    %rax,%rbx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    $0xb4,%edi
  mov    $0x0,%eax
  call   <acc_malloc@plt>
  mov    %eax,%r13d
  movslq %eax,%r12
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    $0x0,%ebp
  lea    0x3(%rbx),%r14
  jmp    L4
L45:
  mov    $0x67,%esi
  mov    %r14,%rdi
  mov    $0x0,%eax
  call   <acc_create@plt>
  lea    0x3(%r12),%rdx
  cltq
  cmp    %rax,%rdx
  sete   %dil
  movzbl %dil,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    $0xb4,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <acc_create@plt>
  cltq
  cmp    %rax,%r12
  sete   %dil
  movzbl %dil,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    $0xb4,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <acc_is_present@plt>
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <acc_unmap_data@plt>
  mov    $0xb4,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <acc_is_present@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  movslq %r13d,%rax
  mov    %ebp,%esi
  lea    0xb4(%rax),%rcx
  mov    $0x0,%edx
L56:
  add    %dl,(%rax)
  add    $0x1,%rax
  add    %esi,%edx
  cmp    %rcx,%rax
  jne    L56
  add    $0x1,%ebp
  cmp    $0x219,%ebp
  je     L3
L4:
  mov    $0xb4,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <acc_map_data@plt>
  mov    $0xb4,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <acc_is_present@plt>
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  test   %ebp,%ebp
  jne    L45
  movabs $0x2525252525252525,%rax
  movabs $0x2525252525252525,%rdx
  mov    %rax,(%rbx)
  mov    %rdx,0x8(%rbx)
  mov    %rax,0x10(%rbx)
  mov    %rdx,0x18(%rbx)
  mov    %rax,0x20(%rbx)
  mov    %rdx,0x28(%rbx)
  mov    %rax,0x30(%rbx)
  mov    %rdx,0x38(%rbx)
  mov    %rax,0x40(%rbx)
  mov    %rdx,0x48(%rbx)
  mov    %rax,0x50(%rbx)
  mov    %rdx,0x58(%rbx)
  mov    %rax,0x60(%rbx)
  mov    %rdx,0x68(%rbx)
  mov    %rax,0x70(%rbx)
  mov    %rdx,0x78(%rbx)
  mov    %rax,0x80(%rbx)
  mov    %rdx,0x88(%rbx)
  mov    %rax,0x90(%rbx)
  mov    %rdx,0x98(%rbx)
  mov    %rax,0xa0(%rbx)
  mov    %rdx,0xa8(%rbx)
  movl   $0x25252525,0xb0(%rbx)
  jmp    L45
L3:
  mov    $0xb4,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <acc_memcpy_from_device@plt>
  mov    $0x25,%ebp
L20:
  movzbl (%rbx),%ecx
  mov    %ebp,%edx
  sar    $0x1f,%edx
  shr    $0x18,%edx
  lea    0x0(%rbp,%rdx,1),%eax
  movzbl %al,%eax
  sub    %edx,%eax
  cmp    %eax,%ecx
  sete   %dil
  movzbl %dil,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  add    $0x1,%rbx
  add    $0x2322c,%ebp
  cmp    $0x18b4715,%ebp
  jne    L20
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <acc_free@plt>
  mov    $0x0,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  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;
}
```