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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  movl   $0x0,-0xc(%rbp)
  mov    $0x0,%eax
  call   <gpio_init@plt>
  mov    $0x0,%esi
  mov    $0x2c,%edi
  call   <gpio_function@plt>
  mov    $0x0,%esi
  mov    $0x2d,%edi
  call   <gpio_function@plt>
  mov    $0x0,%esi
  mov    $0x2b,%edi
  call   <gpio_function@plt>
  movl   $0x0,-0x8(%rbp)
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D22(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D36(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <SPI_init@plt>
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  call   <OLED_init@plt>
  mov    $0x1d4c0,%edi
  call   <usleep@plt>
  mov    $0x8e,%edi
  call   <write_c@plt>
  mov    $0x0,%edi
  call   <write_d@plt>
  mov    $0x0,%edi
  call   <write_d@plt>
  mov    $0x82,%edi
  call   <write_d@plt>
  mov    $0x82,%edi
  call   <write_d@plt>
  mov    $0x186a0,%edi
  call   <usleep@plt>
  mov    $0x92,%edi
  call   <write_c@plt>
  mov    $0x1,%edi
  call   <write_d@plt>
  mov    $0x2710,%edi
  call   <usleep@plt>
  movl   $0x0,-0xc(%rbp)
  jmp    L47
L42:
  mov    $0x86,%edi
  call   <write_c@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  mov    %eax,%edx
  movslq %edx,%rax
  imul   $0x7e07e07f,%rax,%rax
  shr    $0x20,%rax
  sar    $0x6,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  imul   $0x82,%eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,%edi
  call   <write_d@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  mov    %eax,%edx
  movslq %edx,%rax
  imul   $0x7e07e07f,%rax,%rax
  shr    $0x20,%rax
  sar    $0x6,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  imul   $0x82,%eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,%edi
  call   <write_d@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x1a,%edx
  add    %edx,%eax
  and    $0x3f,%eax
  sub    %edx,%eax
  mov    %eax,%edi
  call   <write_d@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  mov    %eax,%edi
  call   <write_d@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  mov    %eax,%edi
  call   <write_d@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  mov    %eax,%edi
  call   <write_d@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  mov    %eax,%edi
  call   <write_d@plt>
  mov    $0x2710,%edi
  call   <usleep@plt>
  addl   $0x1,-0xc(%rbp)
L47:
  cmpl   $0x63,-0xc(%rbp)
  jle    L42
  mov    $0x5c,%edi
  call   <write_c@plt>
  movl   $0x0,-0xc(%rbp)
  jmp    L22
L16:
  mov    $0x5c,%edi
  call   <write_c@plt>
  mov    -0xc(%rbp),%eax
  mov    %eax,%edi
  call   <write_d@plt>
  mov    -0xc(%rbp),%eax
  mov    %eax,%edi
  call   <write_d@plt>
  mov    -0xc(%rbp),%eax
  mov    %eax,%edi
  call   <write_d@plt>
  addl   $0x1,-0xc(%rbp)
L22:
  cmpl   $0x7cf,-0xc(%rbp)
  jle    L16
L24:
  jmp    L24
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D12
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D20
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D22
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D18
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D36
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D64
type_infered: string

tool: D12: 


tool: D20:    ------------------------------------------

tool: D22:    |               SPI Sample                |

tool: D18:    |   Direct Register Access SPI Sample     |

tool: D36:  -> Msg<- Initializing SPI port

tool: D64:  -> Msg<- Result of SPI Init = %d


assistant: ```c
int main(void) {
  int i = 0;
  gpio_init();
  gpio_function(44, 0);
  gpio_function(45, 0);
  gpio_function(43, 0);
  int ClockDivider = 0;
  printf("\n\n");
  printf("   ------------------------------------------\n");
  printf("   |               SPI Sample                |\n");
  printf("   ------------------------------------------\n");
  printf("   |   Direct Register Access SPI Sample     |\n");
  printf("   ------------------------------------------\n");
  printf(" -> Msg<- Initializing SPI port\n");
  int result = SPI_init(ClockDivider);
  printf(" -> Msg<- Result of SPI Init = %d\n", result);
  OLED_init();
  usleep(120000);
  write_c(0x8e);
  write_d(0);
  write_d(0);
  write_d(130);
  write_d(130);
  usleep(100000);
  write_c(0x92);
  write_d(0x01);
  usleep(10000);
  for (i = 0; i < 100; i++) {
    write_c(0x86);
    write_d(rand() % 130);
    write_d(rand() % 130);
    write_d(rand() % 64);
    write_d(rand());
    write_d(rand());
    write_d(rand());
    write_d(rand());
    usleep(10000);
  }
  write_c(0x5c);
  for (i = 0; i < 2000; i++) {
    write_c(0x5c);
    write_d(i);
    write_d(i);
    write_d(i);
  }
  for (;;)
    ;
}
```