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

```asm
<main>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x10(%rsp)
  movl   $0x0,0x14(%rsp)
  movb   $0x53,0xe(%rsp)
  movb   $0x59,0xf(%rsp)
  lea    D116(%rip),%rdi
  call   <printf@plt>
  lea    0x10(%rsp),%rsi
  lea    D61(%rip),%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  movzbl 0xf(%rsp),%eax
  and    $0xffffffdf,%eax
  cmp    $0x59,%al
  jne    L111
  mov    D59(%rip),%ebx
  lea    D145(%rip),%r14
  lea    D48(%rip),%r13
  lea    D10(%rip),%rbp
  lea    D127(%rip),%r12
  jmp    L2
L145:
  cmp    $0x2a,%al
  je     L19
  cmp    $0x2b,%al
  jne    L135
  movss  0x10(%rsp),%xmm0
  movss  0x14(%rsp),%xmm1
  movaps %xmm0,%xmm3
  addss  %xmm1,%xmm3
  movd   %xmm3,%ebx
  cvtss2sd %xmm0,%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm3,%xmm2
  cvtss2sd %xmm1,%xmm1
  mov    $0x2b,%esi
  lea    D136(%rip),%rdi
  mov    $0x3,%eax
  call   <printf@plt>
L125:
  mov    %ebx,0x10(%rsp)
  lea    D123(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    0xf(%rsp),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  movzbl 0xf(%rsp),%eax
  and    $0xffffffdf,%eax
  cmp    $0x59,%al
  jne    L111
L2:
  pxor   %xmm0,%xmm0
  cvtss2sd 0x10(%rsp),%xmm0
  mov    %r14,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    0xe(%rsp),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    0x14(%rsp),%rsi
  lea    D61(%rip),%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  movzbl 0xe(%rsp),%eax
  cmp    $0x2d,%al
  je     L122
  jle    L145
  cmp    $0x2f,%al
  je     L4
  cmp    $0x5e,%al
  jne    L135
  movss  0x14(%rsp),%xmm1
  movss  0x10(%rsp),%xmm0
  call   <pow@plt>
  movd   %xmm0,%ebx
  movsbl 0xe(%rsp),%esi
  pxor   %xmm0,%xmm0
  cvtss2sd 0x10(%rsp),%xmm0
  movd   %ebx,%xmm5
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm5,%xmm2
  pxor   %xmm1,%xmm1
  cvtss2sd 0x14(%rsp),%xmm1
  lea    D136(%rip),%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  jmp    L125
L122:
  movss  0x10(%rsp),%xmm0
  movss  0x14(%rsp),%xmm1
  movaps %xmm0,%xmm4
  subss  %xmm1,%xmm4
  movd   %xmm4,%ebx
  cvtss2sd %xmm0,%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm4,%xmm2
  cvtss2sd %xmm1,%xmm1
  mov    $0x2d,%esi
  lea    D136(%rip),%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  jmp    L125
L4:
  movss  0x10(%rsp),%xmm0
  movss  0x14(%rsp),%xmm1
  movaps %xmm0,%xmm5
  divss  %xmm1,%xmm5
  movd   %xmm5,%ebx
  cvtss2sd %xmm0,%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm5,%xmm2
  cvtss2sd %xmm1,%xmm1
  mov    $0x2f,%esi
  lea    D136(%rip),%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  jmp    L125
L19:
  movss  0x10(%rsp),%xmm0
  movss  0x14(%rsp),%xmm1
  movaps %xmm0,%xmm6
  mulss  %xmm1,%xmm6
  movd   %xmm6,%ebx
  cvtss2sd %xmm0,%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm6,%xmm2
  cvtss2sd %xmm1,%xmm1
  mov    $0x2a,%esi
  lea    D136(%rip),%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  jmp    L125
L135:
  lea    D69(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L125
L111:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L41
  mov    $0x0,%eax
  add    $0x20,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L41:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: label: D116
type_guessed: string
name: read_data
arguments: label: D61
type_guessed: string
name: read_data
arguments: label: D59
type_guessed: byte[4]
name: read_data
arguments: label: D145
type_guessed: string
name: read_data
arguments: label: D48
type_guessed: string
name: read_data
arguments: label: D10
type_guessed: string
name: read_data
arguments: label: D127
type_guessed: string
name: read_data
arguments: label: D136
type_guessed: string
name: read_data
arguments: label: D123
type_guessed: string
name: read_data
arguments: label: D69
type_guessed: string

tool: D116: Masukan bilangan pertama untuk dihitung: 

tool: D61: %f

tool: {"D59": [0x00,0x00,0x00,0x00]}

tool: D145: Bilangan pertama adalah: %.2f

tool: D48: 
Masukan operator untuk menghitung. Terbatas untuk +-*/^: 

tool: D10: %s

tool: D127: Masukan bilangan kedua untuk dihitung: 

tool: D136: %.2f %c %.2f = %.2f

tool: D123: 
Apakah anda ingin menghitung lagi? Jika Tidak, tekan 'T'.

tool: D69: Simbol tidak valid.

assistant: ```c
int main() {
  float masukan1 = 0.0f, masukan2 = 0.0f, hasil = 0.0f;
  char simbol = 'S';
  char ulang = 'Y';
  printf("Masukan bilangan pertama untuk dihitung: ");
  scanf("%f", &masukan1);
  while (ulang == 'Y' || ulang == 'y') {
    printf("Bilangan pertama adalah: %.2f", masukan1);
    printf("\nMasukan operator untuk menghitung. Terbatas untuk +-*/^: ");
    scanf("%s", &simbol);
    printf("Masukan bilangan kedua untuk dihitung: ");
    scanf("%f", &masukan2);
    switch (simbol) {
    case '+': {
      hasil = masukan1 + masukan2;
      printf("%.2f %c %.2f = %.2f", masukan1, simbol, masukan2, hasil);
    } break;
    case '-': {
      hasil = masukan1 - masukan2;
      printf("%.2f %c %.2f = %.2f", masukan1, simbol, masukan2, hasil);
    } break;
    case '/': {
      hasil = masukan1 / masukan2;
      printf("%.2f %c %.2f = %.2f", masukan1, simbol, masukan2, hasil);
    } break;
    case '*': {
      hasil = masukan1 * masukan2;
      printf("%.2f %c %.2f = %.2f", masukan1, simbol, masukan2, hasil);
    } break;
    case '^': {
      hasil = pow(masukan1, masukan2);
      printf("%.2f %c %.2f = %.2f", masukan1, simbol, masukan2, hasil);
    } break;
    default: {
      printf("Simbol tidak valid.");
    }
    }
    masukan1 = hasil;
    printf("\nApakah anda ingin menghitung lagi? Jika Tidak, tekan 'T'.");
    scanf("%s", &ulang);
  }
  return 0;
}
```