user: Converte this assembly snippet into its equivalent C code:

```asm
<ex6>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  lea    D247(%rip),%rdi
  call   <puts@plt>
  lea    D54(%rip),%rdi
  call   <puts@plt>
  lea    D204(%rip),%rdi
  call   <puts@plt>
  lea    D78(%rip),%rdi
  call   <puts@plt>
  lea    D236(%rip),%rdi
  call   <puts@plt>
  lea    D70(%rip),%rdi
  call   <puts@plt>
  lea    D152(%rip),%rdi
  call   <puts@plt>
  lea    D196(%rip),%rdi
  call   <puts@plt>
  movl   $0x0,0x8(%rsp)
  movl   $0x0,0x14(%rsp)
  movl   $0x0,0xc(%rsp)
  mov    $0x0,%r15d
  mov    $0x0,%r14d
  mov    $0x0,%r13d
  lea    D158(%rip),%r12
  lea    0x24(%rsp),%rbp
  lea    D61(%rip),%rbx
  jmp    L78
L49:
  add    $0x1,%r13d
L78:
  mov    %r12,%rdi
  call   <puts@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x24(%rsp),%eax
  test   %eax,%eax
  je     L63
  cmp    $0x1,%eax
  je     L49
  cmp    $0x2,%eax
  je     L46
  cmp    $0x3,%eax
  je     L158
  cmp    $0x4,%eax
  je     L11
  cmp    $0x63,%eax
  je     L64
  addl   $0x1,0x8(%rsp)
  jmp    L78
L46:
  add    $0x1,%r14d
  jmp    L78
L158:
  add    $0x1,%r15d
  jmp    L78
L11:
  addl   $0x1,0xc(%rsp)
  jmp    L78
L64:
  addl   $0x1,0x14(%rsp)
  jmp    L78
L63:
  lea    0x0(%r13,%r14,1),%esi
  add    %r15d,%esi
  mov    0xc(%rsp),%ebx
  add    %ebx,%esi
  pxor   %xmm1,%xmm1
  cvtsi2ss %esi,%xmm1
  pxor   %xmm2,%xmm2
  cvtsi2ss %r13d,%xmm2
  divss  %xmm1,%xmm2
  movss  D135(%rip),%xmm0
  mulss  %xmm0,%xmm2
  movss  %xmm2,0xc(%rsp)
  pxor   %xmm2,%xmm2
  cvtsi2ss %r14d,%xmm2
  divss  %xmm1,%xmm2
  movaps %xmm2,%xmm3
  mulss  %xmm0,%xmm3
  movss  %xmm3,0x10(%rsp)
  pxor   %xmm2,%xmm2
  cvtsi2ss %r15d,%xmm2
  divss  %xmm1,%xmm2
  movaps %xmm2,%xmm4
  mulss  %xmm0,%xmm4
  movss  %xmm4,0x18(%rsp)
  pxor   %xmm2,%xmm2
  cvtsi2ss %ebx,%xmm2
  divss  %xmm1,%xmm2
  movaps %xmm2,%xmm5
  mulss  %xmm0,%xmm5
  movss  %xmm5,0x1c(%rsp)
  lea    D124(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  pxor   %xmm0,%xmm0
  cvtss2sd 0xc(%rsp),%xmm0
  mov    %r13d,%esi
  lea    D248(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  pxor   %xmm0,%xmm0
  cvtss2sd 0x10(%rsp),%xmm0
  mov    %r14d,%esi
  lea    D81(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  pxor   %xmm0,%xmm0
  cvtss2sd 0x18(%rsp),%xmm0
  mov    %r15d,%esi
  lea    D174(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  pxor   %xmm0,%xmm0
  cvtss2sd 0x1c(%rsp),%xmm0
  mov    %ebx,%esi
  lea    D25(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  mov    0x14(%rsp),%esi
  lea    D157(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x8(%rsp),%esi
  lea    D95(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movss  0xc(%rsp),%xmm2
  comiss D18(%rip),%xmm2
  ja     L129
  movss  0x10(%rsp),%xmm6
  comiss D18(%rip),%xmm6
  ja     L86
  movss  0x18(%rsp),%xmm7
  comiss D18(%rip),%xmm7
  ja     L208
  movss  0x1c(%rsp),%xmm7
  comiss D18(%rip),%xmm7
  jbe    L207
  lea    D16(%rip),%rdi
  call   <puts@plt>
  jmp    L91
L129:
  lea    D58(%rip),%rdi
  call   <puts@plt>
L91:
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L114
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L86:
  lea    D201(%rip),%rdi
  call   <puts@plt>
  jmp    L91
L208:
  lea    D242(%rip),%rdi
  call   <puts@plt>
  jmp    L91
L207:
  lea    D253(%rip),%rdi
  call   <puts@plt>
  jmp    L91
L114:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D247
type: string
name: retrieve_data
arguments: label: D54
type: string
name: retrieve_data
arguments: label: D204
type: string
name: retrieve_data
arguments: label: D78
type: string
name: retrieve_data
arguments: label: D236
type: string
name: retrieve_data
arguments: label: D70
type: string
name: retrieve_data
arguments: label: D152
type: string
name: retrieve_data
arguments: label: D196
type: string
name: retrieve_data
arguments: label: D158
type: string
name: retrieve_data
arguments: label: D61
type: string
name: retrieve_data
arguments: label: D135
type: f32
name: retrieve_data
arguments: label: D124
type: string
name: retrieve_data
arguments: label: D248
type: string
name: retrieve_data
arguments: label: D81
type: string
name: retrieve_data
arguments: label: D174
type: string
name: retrieve_data
arguments: label: D25
type: string
name: retrieve_data
arguments: label: D157
type: string
name: retrieve_data
arguments: label: D95
type: string
name: retrieve_data
arguments: label: D18
type: byte[4]
name: retrieve_data
arguments: label: D16
type: string
name: retrieve_data
arguments: label: D58
type: string
name: retrieve_data
arguments: label: D201
type: string
name: retrieve_data
arguments: label: D242
type: string
name: retrieve_data
arguments: label: D253
type: string

tool: D247: Eleicao:

tool: D54: 	0 para encerrar a votacao;

tool: D204: 	1 para o candidato 1;

tool: D78: 	2 para o candidato 2;

tool: D236: 	3 para o candidato 3;

tool: D70: 	4 para o candidato 4;

tool: D152: 	99 para votar em branco;

tool: D196: 	Qualquer outro valor para votar nulo.

tool: D158: Informe o voto:

tool: D61: %d

tool: D135: 100

tool: D124: 
Votos validos: %d


tool: D248: Primeiro Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D81: Segundo Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D174: Terceiro Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D25: Quarto Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D157: Votos brancos: %d


tool: D95: Votos nulos: %d


tool: {"D18": [0x00,0x00,0x48,0x42]}

tool: D16: 
Vencedor: Quarto Candidato.

tool: D58: 
Vencedor: Primeiro Candidato.

tool: D201: 
Vencedor: Segundo Candidato.

tool: D242: 
Vencedor: Terceiro Candidato.

tool: D253: 
Havera segundo turno.

assistant: ```c
void ex6() {
  int num, c1 = 0, c2 = 0, c3 = 0, c4 = 0, b = 0, n = 0;
  printf("Eleicao:\n");
  printf("\t0 para encerrar a votacao;\n");
  printf("\t1 para o candidato 1;\n");
  printf("\t2 para o candidato 2;\n");
  printf("\t3 para o candidato 3;\n");
  printf("\t4 para o candidato 4;\n");
  printf("\t99 para votar em branco;\n");
  printf("\tQualquer outro valor para votar nulo.\n");
  while (1) {
    printf("Informe o voto:\n");
    scanf("%d", &num);
    if (!num)
      break;
    if (num == 1)
      c1++;
    else if (num == 2)
      c2++;
    else if (num == 3)
      c3++;
    else if (num == 4)
      c4++;
    else if (num == 99)
      b++;
    else
      n++;
  }
  int validos = c1 + c2 + c3 + c4;
  float p1 = (float)c1 / validos * 100;
  float p2 = (float)c2 / validos * 100;
  float p3 = (float)c3 / validos * 100;
  float p4 = (float)c4 / validos * 100;
  printf("\nVotos validos: %d\n", validos);
  printf("Primeiro Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c1, p1);
  printf("Segundo Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c2, p2);
  printf("Terceiro Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c3, p3);
  printf("Quarto Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c4, p4);
  printf("Votos brancos: %d\n", b);
  printf("Votos nulos: %d\n", n);
  if (p1 > 50)
    printf("\nVencedor: Primeiro Candidato.\n");
  else if (p2 > 50)
    printf("\nVencedor: Segundo Candidato.\n");
  else if (p3 > 50)
    printf("\nVencedor: Terceiro Candidato.\n");
  else if (p4 > 50)
    printf("\nVencedor: Quarto Candidato.\n");
  else
    printf("\nHavera segundo turno.\n");
}
```