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

```asm
<ex1>:
  endbr64
  push   %r15
  xor    %edi,%edi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    $0xcccccccd,%ebp
  push   %rbx
  sub    $0x4d8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x4c8(%rsp)
  xor    %eax,%eax
  movb   $0x65,0x4c7(%rsp)
  lea    0x30(%rsp),%r15
  movl   $0x64636261,0x4c3(%rsp)
  call   <time@plt>
  mov    %eax,%edi
  call   <srand@plt>
  lea    0x130(%rsp),%rax
  movq   $0x0,0x18(%rsp)
  mov    %rax,0x28(%rsp)
  lea    0x4b4(%rsp),%rax
  mov    %rax,0x20(%rsp)
  mov    %rax,%rbx
  lea    0xb0(%rsp),%rax
  mov    %rax,(%rsp)
L10:
  mov    0x18(%rsp),%rax
  mov    0x28(%rsp),%rsi
  lea    -0x384(%rbx),%r13
  mov    $0x78,%r12d
  add    %rax,%rsi
  mov    %rsi,0x10(%rsp)
  mov    0x20(%rsp),%rsi
  add    %rsi,%rax
  mov    %rax,0x8(%rsp)
  nopl   0x0(%rax)
L15:
  xor    %eax,%eax
  call   <rand@plt>
  movslq %eax,%rdx
  mov    %eax,%ecx
  imul   $0x51eb851f,%rdx,%rdx
  sar    $0x1f,%ecx
  sar    $0x25,%rdx
  sub    %ecx,%edx
  imul   $0x64,%edx,%edx
  sub    %edx,%eax
  add    $0x1e,%eax
  mov    %eax,(%r15,%r12,1)
  xor    %eax,%eax
  call   <rand@plt>
  mov    (%rsp),%rsi
  mov    0x10(%rsp),%r14
  movslq %eax,%rdx
  mov    %eax,%ecx
  imul   $0x66666667,%rdx,%rdx
  sar    $0x1f,%ecx
  sar    $0x24,%rdx
  sub    %ecx,%edx
  lea    (%rdx,%rdx,4),%edx
  shl    $0x3,%edx
  sub    %edx,%eax
  add    $0x1,%eax
  mov    %eax,(%rsi,%r12,1)
  nopl   0x0(%rax)
L6:
  xor    %eax,%eax
  add    $0x1e,%r14
  call   <rand@plt>
  mov    %eax,%edx
  imul   %rbp,%rdx
  shr    $0x22,%rdx
  lea    (%rdx,%rdx,4),%edx
  sub    %edx,%eax
  movzbl 0x4c3(%rsp,%rax,1),%eax
  mov    %al,-0x1e(%r14)
  cmp    %rbx,%r14
  jne    L6
  movsbl 0x0(%r13),%edi
  add    $0x4,%r12
  add    $0x1e,%r13
  call   <putchar@plt>
  cmp    0x8(%rsp),%r13
  jne    L15
  mov    0x18(%rsp),%rbx
  mov    (%rsp),%rsi
  mov    $0x0,%ecx
  lea    D19(%rip),%rdx
  lea    D23(%rip),%rdi
  mov    0x78(%r15,%rbx,4),%eax
  sub    0x78(%rsi,%rbx,4),%eax
  lea    D17(%rip),%rsi
  cmovns %eax,%ecx
  cmp    $0x32,%eax
  lea    D29(%rip),%rax
  cmovl  %rax,%rdx
  xor    %eax,%eax
  call   <printf@plt>
  mov    %rbx,%rax
  lea    0x1(%r14),%rbx
  add    $0x1,%rax
  mov    %rax,0x18(%rsp)
  cmp    $0x1e,%rax
  jne    L10
  mov    0x4c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L18
  add    $0x4d8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L18:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: data_label: D19
type_infered: string
name: read_data
arguments: data_label: D23
type_infered: string
name: read_data
arguments: data_label: D17
type_infered: string
name: read_data
arguments: data_label: D29
type_infered: string

tool: D19: 

tool: D23: 
%s ||  %s ||  %d



tool: D17: Quantidade estoque

tool: D29: Estoque abaixo de 50

assistant: ```c
void ex1() {
  int qtdp[1][30], qtdv[1][30];
  char name[30][30], alph[5] = {'a', 'b', 'c', 'd', 'e'};
  srand(time(NULL));
  for (int i = 0; i < 30; i++) {
    for (int k = 0; k < 30; k++) {
      qtdp[1][k] = rand() % 100 + 30;
      qtdv[1][k] = rand() % 40 + 1;
      for (int j = 0; j < 30; j++) {
        name[j][i] = alph[(unsigned int)rand() % 5];
      }
      printf("%c", name[k][i]);
    }
    printf("\n%s ||  %s ||  %d\n\n", "Quantidade estoque", qtdp[1][i] - qtdv[1][i] < 50 ? "Estoque abaixo de 50" : "\b\b\b\b\b", qtdp[1][i] - qtdv[1][i] >= 0 ? qtdp[1][i] - qtdv[1][i] : 0);
  }
}
```