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

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    -0xb000(%rsp),%r11
L15:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L15
  sub    $0xba8,%rsp
  lea    D8(%rip),%rbp
  mov    %rbp,%rdi
  mov    %fs:0x28,%rax
  mov    %rax,0xbb98(%rsp)
  xor    %eax,%eax
  lea    0x10(%rsp),%rbx
  lea    0xc90(%rsp),%r13
  call   <printf@plt>
  lea    D18(%rip),%rdi
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <printf@plt>
  mov    %rbx,0x8(%rsp)
  cs nopw 0x0(%rax,%rax,1)
L31:
  xor    %eax,%eax
  add    $0x4,%rbx
  call   <rand@plt>
  movslq %eax,%rdx
  mov    %eax,%ecx
  imul   $0x51eb851f,%rdx,%rdx
  sar    $0x1f,%ecx
  sar    $0x29,%rdx
  sub    %ecx,%edx
  imul   $0x640,%edx,%edx
  sub    %edx,%eax
  mov    %eax,-0x4(%rbx)
  cmp    %r13,%rbx
  jne    L31
  mov    %r13,%rbp
  lea    0x2590(%rsp),%rbx
  nopl   0x0(%rax,%rax,1)
L97:
  xor    %eax,%eax
  add    $0x4,%rbp
  call   <rand@plt>
  movslq %eax,%rdx
  mov    %eax,%ecx
  imul   $0x51eb851f,%rdx,%rdx
  sar    $0x1f,%ecx
  sar    $0x2a,%rdx
  sub    %ecx,%edx
  imul   $0xc80,%edx,%edx
  sub    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmp    %rbx,%rbp
  jne    L97
  mov    %rbx,%rbp
  lea    0x4b10(%rsp),%r12
  nopl   0x0(%rax,%rax,1)
L138:
  xor    %eax,%eax
  add    $0x4,%rbp
  call   <rand@plt>
  movslq %eax,%rdx
  mov    %eax,%ecx
  imul   $0x1b4e81b5,%rdx,%rdx
  sar    $0x1f,%ecx
  sar    $0x29,%rdx
  sub    %ecx,%edx
  imul   $0x12c0,%edx,%edx
  sub    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmp    %r12,%rbp
  jne    L138
  mov    %r12,%r14
  lea    0x7d10(%rsp),%rbp
  nopl   0x0(%rax,%rax,1)
L53:
  xor    %eax,%eax
  add    $0x4,%r14
  call   <rand@plt>
  movslq %eax,%rdx
  mov    %eax,%ecx
  imul   $0x51eb851f,%rdx,%rdx
  sar    $0x1f,%ecx
  sar    $0x2b,%rdx
  sub    %ecx,%edx
  imul   $0x1900,%edx,%edx
  sub    %edx,%eax
  mov    %eax,-0x4(%r14)
  cmp    %r14,%rbp
  jne    L53
  mov    %rbp,%r15
  lea    0xbb90(%rsp),%r14
  nopl   0x0(%rax)
L121:
  xor    %eax,%eax
  add    $0x4,%r15
  call   <rand@plt>
  movslq %eax,%rdx
  mov    %eax,%esi
  imul   $0x10624dd3,%rdx,%rdx
  sar    $0x1f,%esi
  sar    $0x29,%rdx
  sub    %esi,%edx
  imul   $0x1f40,%edx,%edx
  sub    %edx,%eax
  mov    %eax,-0x4(%r15)
  cmp    %r14,%r15
  jne    L121
  mov    $0x2,%r14d
  lea    -0x1(%r14),%eax
  cmp    $0x4,%eax
  je     L134
L54:
  jg     L122
  cmp    $0x2,%eax
  je     L38
  cmp    $0x3,%eax
  jne    L95
  mov    $0x960,%esi
  mov    %rbx,%rdi
  call   <improved_bubblesort@plt>
L14:
  add    $0x1,%r14d
  lea    -0x1(%r14),%eax
  cmp    $0x4,%eax
  jne    L54
L134:
  mov    $0xc80,%esi
  mov    %r12,%rdi
  call   <improved_bubblesort@plt>
  jmp    L14
  nopl   0x0(%rax)
L122:
  cmp    $0x5,%eax
  jne    L95
  mov    $0xfa0,%esi
  mov    %rbp,%rdi
  call   <improved_bubblesort@plt>
L6:
  xor    %eax,%eax
  call   <getchar@plt>
  mov    0xbb98(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L88
  add    $0xbba8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L95:
  mov    0x8(%rsp),%rdi
  mov    $0x320,%esi
  call   <improved_bubblesort@plt>
  cmp    $0x6,%r14d
  jne    L14
  jmp    L6
  nopw   0x0(%rax,%rax,1)
L38:
  mov    $0x640,%esi
  mov    %r13,%rdi
  call   <improved_bubblesort@plt>
  jmp    L14
L88:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D8
type_guessed: string
name: disassemble_data
arguments: data_tag: D18
type_guessed: string

tool: D8: ============================

tool: D18: 
Improved Bubble Sort Results


assistant: ```c
main() {
  printf("============================");
  printf("\nImproved Bubble Sort Results\n");
  printf("============================");
  int i, j;
  int array1[800];
  int array2[1600];
  int array3[2400];
  int array4[3200];
  int array5[4000];
  for (i = 0; i < 800; i++) {
    array1[i] = rand() % (2 * 800);
  }
  for (i = 0; i < 1600; i++) {
    array2[i] = rand() % (2 * 1600);
  }
  for (i = 0; i < 2400; i++) {
    array3[i] = rand() % (2 * 2400);
  }
  for (i = 0; i < 3200; i++) {
    array4[i] = rand() % (2 * 3200);
  }
  for (i = 0; i < 4000; i++) {
    array5[i] = rand() % (2 * 4000);
  }
  for (j = 1; j < 6; j++) {
    switch (j) {
    case 1: {
      improved_bubblesort(array1, 800);
      break;
    }
    case 2: {
      improved_bubblesort(array2, 1600);
      break;
    }
    case 3: {
      improved_bubblesort(array3, 2400);
      break;
    }
    case 4: {
      improved_bubblesort(array4, 3200);
      break;
    }
    case 5: {
      improved_bubblesort(array5, 4000);
      break;
    }
    }
  }
  getchar();
}
```