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

```asm
<aes256ctr>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  push   %r12
  mov    %rsi,%r12
  mov    %r8,%rsi
  push   %rbp
  mov    %rcx,%rbp
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x148,%rsp
  mov    %rdi,0x8(%rsp)
  lea    0x110(%rsp),%r13
  lea    0x20(%rsp),%r15
  mov    %rdx,0x10(%rsp)
  mov    %r13,%rdi
  mov    $0x10,%edx
  mov    %fs:0x28,%rax
  mov    %rax,0x138(%rsp)
  xor    %eax,%eax
  call   <memcpy@plt>
  mov    %rbp,%rsi
  mov    %r15,%rdi
  call   <aeskey@plt>
  cmp    $0xf,%rbx
  jbe    L168
  mov    %rbx,%rax
  lea    0x120(%rsp),%rbp
  mov    %r12,%rbx
  sub    $0x10,%rax
  mov    %rax,0x18(%rsp)
  and    $0xfffffffffffffff0,%rax
  lea    0x10(%r12,%rax,1),%rax
  mov    %rax,(%rsp)
  nopl   0x0(%rax)
L335:
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  add    $0x10,%rbx
  call   <aescrypt@plt>
  movzbl -0x10(%rbx),%eax
  mov    %r13,%rdi
  add    $0x10,%r14
  xor    0x120(%rsp),%al
  mov    %al,-0x10(%r14)
  movzbl -0xf(%rbx),%eax
  xor    0x121(%rsp),%al
  mov    %al,-0xf(%r14)
  movzbl -0xe(%rbx),%eax
  xor    0x122(%rsp),%al
  mov    %al,-0xe(%r14)
  movzbl -0xd(%rbx),%eax
  xor    0x123(%rsp),%al
  mov    %al,-0xd(%r14)
  movzbl -0xc(%rbx),%eax
  xor    0x124(%rsp),%al
  mov    %al,-0xc(%r14)
  movzbl -0xb(%rbx),%eax
  xor    0x125(%rsp),%al
  mov    %al,-0xb(%r14)
  movzbl -0xa(%rbx),%eax
  xor    0x126(%rsp),%al
  mov    %al,-0xa(%r14)
  movzbl -0x9(%rbx),%eax
  xor    0x127(%rsp),%al
  mov    %al,-0x9(%r14)
  movzbl -0x8(%rbx),%eax
  xor    0x128(%rsp),%al
  mov    %al,-0x8(%r14)
  movzbl -0x7(%rbx),%eax
  xor    0x129(%rsp),%al
  mov    %al,-0x7(%r14)
  movzbl -0x6(%rbx),%eax
  xor    0x12a(%rsp),%al
  mov    %al,-0x6(%r14)
  movzbl -0x5(%rbx),%eax
  xor    0x12b(%rsp),%al
  mov    %al,-0x5(%r14)
  movzbl -0x4(%rbx),%eax
  xor    0x12c(%rsp),%al
  mov    %al,-0x4(%r14)
  movzbl -0x3(%rbx),%eax
  xor    0x12d(%rsp),%al
  mov    %al,-0x3(%r14)
  movzbl -0x2(%rbx),%eax
  xor    0x12e(%rsp),%al
  mov    %al,-0x2(%r14)
  movzbl -0x1(%rbx),%eax
  xor    0x12f(%rsp),%al
  mov    %al,-0x1(%r14)
  call   <incr@plt>
  cmp    %rbx,(%rsp)
  jne    L335
  mov    0x18(%rsp),%rax
  and    $0xfffffffffffffff0,%rax
  lea    0x10(%rax),%rbx
L124:
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <aescrypt@plt>
  mov    0x10(%rsp),%rax
  cmp    %rbx,%rax
  jbe    L208
  mov    %rax,%rdx
  mov    0x8(%rsp),%rax
  lea    0x1(%rbx),%rsi
  lea    (%r12,%rsi,1),%rdi
  sub    %rbx,%rdx
  add    %rbx,%rax
  lea    -0x1(%rdx),%rcx
  mov    %rax,%r9
  sub    %rdi,%r9
  cmp    $0xe,%r9
  jbe    L47
  cmp    $0x6,%rcx
  jbe    L47
  cmp    $0xe,%rcx
  jbe    L305
  mov    %rdx,%rcx
  movdqu (%r12,%rbx,1),%xmm0
  pxor   0x120(%rsp),%xmm0
  and    $0xfffffffffffffff0,%rcx
  lea    (%rcx,%rbx,1),%rdi
  movups %xmm0,(%rax)
  mov    %ecx,%eax
  mov    %rdi,%rsi
  cmp    %rdx,%rcx
  je     L208
  sub    %rcx,%rdx
  lea    -0x1(%rdx),%r9
  cmp    $0x6,%r9
  jbe    L212
L263:
  movq   0x120(%rsp,%rcx,1),%xmm1
  movq   (%r12,%rdi,1),%xmm0
  mov    0x8(%rsp),%rcx
  pxor   %xmm1,%xmm0
  movq   %xmm0,(%rcx,%rdi,1)
  mov    %rdx,%rcx
  and    $0xfffffffffffffff8,%rcx
  add    %rcx,%rsi
  add    %ecx,%eax
  cmp    %rcx,%rdx
  je     L208
L212:
  movslq %eax,%rcx
  mov    0x8(%rsp),%rdi
  movzbl (%r12,%rsi,1),%edx
  xor    0x120(%rsp,%rcx,1),%dl
  mov    0x10(%rsp),%r10
  mov    %dl,(%rdi,%rsi,1)
  lea    0x1(%rax),%edx
  movslq %edx,%rdx
  lea    (%rdx,%rbx,1),%rcx
  cmp    %rcx,%r10
  jbe    L208
  movzbl (%r12,%rcx,1),%esi
  xor    0x120(%rsp,%rdx,1),%sil
  lea    0x2(%rax),%edx
  movslq %edx,%rdx
  mov    %sil,(%rdi,%rcx,1)
  lea    (%rdx,%rbx,1),%rcx
  cmp    %rcx,%r10
  jbe    L208
  movzbl (%r12,%rcx,1),%esi
  xor    0x120(%rsp,%rdx,1),%sil
  lea    0x3(%rax),%edx
  movslq %edx,%rdx
  mov    %sil,(%rdi,%rcx,1)
  lea    (%rdx,%rbx,1),%rcx
  cmp    %rcx,%r10
  jbe    L208
  movzbl (%r12,%rcx,1),%esi
  xor    0x120(%rsp,%rdx,1),%sil
  lea    0x4(%rax),%edx
  movslq %edx,%rdx
  mov    %sil,(%rdi,%rcx,1)
  lea    (%rdx,%rbx,1),%rcx
  cmp    %rcx,%r10
  jbe    L208
  movzbl (%r12,%rcx,1),%esi
  xor    0x120(%rsp,%rdx,1),%sil
  lea    0x5(%rax),%edx
  movslq %edx,%rdx
  mov    %sil,(%rdi,%rcx,1)
  lea    (%rdx,%rbx,1),%rcx
  cmp    %rcx,%r10
  jbe    L208
  add    $0x6,%eax
  movzbl (%r12,%rcx,1),%esi
  xor    0x120(%rsp,%rdx,1),%sil
  cltq
  mov    %esi,%edx
  add    %rax,%rbx
  mov    %dl,(%rdi,%rcx,1)
  cmp    %rbx,%r10
  jbe    L208
  movzbl (%r12,%rbx,1),%edx
  xor    0x120(%rsp,%rax,1),%dl
  mov    %dl,(%rdi,%rbx,1)
L208:
  xor    %eax,%eax
  mov    $0x1e,%ecx
  mov    %r15,%rdi
  mov    $0x10,%esi
  rep stos %rax,%es:(%rdi)
  mov    %rbp,%rdi
  call   <bzero@plt>
  mov    0x138(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L220
  add    $0x148,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L47:
  mov    0x10(%rsp),%rcx
  movzbl (%r12,%rbx,1),%edx
  xor    0x120(%rsp),%dl
  mov    %dl,(%rax)
  cmp    %rsi,%rcx
  jbe    L208
  mov    0x8(%rsp),%rdx
  movzbl 0x121(%rsp),%eax
  xor    (%rdi),%al
  mov    %al,(%rdx,%rsi,1)
  lea    0x2(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x2(%r12,%rbx,1),%eax
  xor    0x122(%rsp),%al
  mov    %al,0x2(%rdx,%rbx,1)
  lea    0x3(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x3(%r12,%rbx,1),%eax
  xor    0x123(%rsp),%al
  mov    %al,0x3(%rdx,%rbx,1)
  lea    0x4(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x4(%r12,%rbx,1),%eax
  xor    0x124(%rsp),%al
  mov    %al,0x4(%rdx,%rbx,1)
  lea    0x5(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x5(%r12,%rbx,1),%eax
  xor    0x125(%rsp),%al
  mov    %al,0x5(%rdx,%rbx,1)
  lea    0x6(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x6(%r12,%rbx,1),%eax
  xor    0x126(%rsp),%al
  mov    %al,0x6(%rdx,%rbx,1)
  lea    0x7(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x7(%r12,%rbx,1),%eax
  xor    0x127(%rsp),%al
  mov    %al,0x7(%rdx,%rbx,1)
  lea    0x8(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x8(%r12,%rbx,1),%eax
  xor    0x128(%rsp),%al
  mov    %al,0x8(%rdx,%rbx,1)
  lea    0x9(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0x9(%r12,%rbx,1),%eax
  xor    0x129(%rsp),%al
  mov    %al,0x9(%rdx,%rbx,1)
  lea    0xa(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0xa(%r12,%rbx,1),%eax
  xor    0x12a(%rsp),%al
  mov    %al,0xa(%rdx,%rbx,1)
  lea    0xb(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0xb(%r12,%rbx,1),%eax
  xor    0x12b(%rsp),%al
  mov    %al,0xb(%rdx,%rbx,1)
  lea    0xc(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0xc(%r12,%rbx,1),%eax
  xor    0x12c(%rsp),%al
  mov    %al,0xc(%rdx,%rbx,1)
  lea    0xd(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0xd(%r12,%rbx,1),%eax
  xor    0x12d(%rsp),%al
  mov    %al,0xd(%rdx,%rbx,1)
  lea    0xe(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0xe(%r12,%rbx,1),%eax
  xor    0x12e(%rsp),%al
  mov    %al,0xe(%rdx,%rbx,1)
  lea    0xf(%rbx),%rax
  cmp    %rax,%rcx
  jbe    L208
  movzbl 0xf(%r12,%rbx,1),%eax
  xor    0x12f(%rsp),%al
  mov    %al,0xf(%rdx,%rbx,1)
  jmp    L208
L168:
  xor    %ebx,%ebx
  lea    0x120(%rsp),%rbp
  jmp    L124
L305:
  mov    %rbx,%rsi
  xor    %ecx,%ecx
  xor    %eax,%eax
  mov    %rbx,%rdi
  jmp    L263
L220:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void aes256ctr(unsigned char *out, unsigned char *in, unsigned long long len, unsigned char *key, unsigned char *icb) {
  unsigned int state[60];
  unsigned char inblock[16];
  unsigned char tempblock[16];
  unsigned long long place;
  memcpy(inblock, icb, 16);
  aeskey(state, key);
  for (place = 0; place + 15 < len; place += 16) {
    aescrypt(tempblock, inblock, state);
    for (int i = 0; i < 16; i++) {
      out[place + i] = in[place + i] ^ tempblock[i];
    }
    incr(inblock);
  }
  aescrypt(tempblock, inblock, state);
  for (int i = 0; i + place < len; i++)
    out[place + i] = in[place + i] ^ tempblock[i];
  for (int i = 0; i < 60; i++) {
    state[i] = 0;
  }
  bzero(tempblock, 16);
}
```