user: 请将以下的汇编代码转换成C语言代码:

```asm
<main>:
  endbr64
  push   %r15
  lea    D10(%rip),%rdi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  lea    D102(%rip),%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x30(%rsp)
  movl   $0x0,0x34(%rsp)
  movb   $0x53,0x2e(%rsp)
  movb   $0x59,0x2f(%rsp)
  call   <printf@plt>
  lea    0x30(%rsp),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  movzbl 0x2f(%rsp),%eax
  and    $0xffffffdf,%eax
  cmp    $0x59,%al
  jne    L12
  lea    0x34(%rsp),%rax
  pxor   %xmm2,%xmm2
  lea    D1(%rip),%r15
  mov    %rax,0x18(%rsp)
  lea    0x2f(%rsp),%rax
  lea    D39(%rip),%r14
  mov    %rax,0x10(%rsp)
  lea    0x2e(%rsp),%r13
  lea    D43(%rip),%rbx
  movss  %xmm2,0xc(%rsp)
  lea    D62(%rip),%r12
  jmp    L138
  nopw   0x0(%rax,%rax,1)
L0:
  cmp    $0x2a,%al
  je     L55
  cmp    $0x2b,%al
  jne    L24
  movss  0x30(%rsp),%xmm0
  movss  0x34(%rsp),%xmm1
  pxor   %xmm2,%xmm2
  mov    $0x2b,%esi
  lea    D86(%rip),%rdi
  mov    $0x3,%eax
  movaps %xmm0,%xmm4
  cvtss2sd %xmm0,%xmm0
  addss  %xmm1,%xmm4
  cvtss2sd %xmm1,%xmm1
  movss  %xmm4,0xc(%rsp)
  cvtss2sd %xmm4,%xmm2
  call   <printf@plt>
  nopw   0x0(%rax,%rax,1)
L10:
  movss  0xc(%rsp),%xmm3
  lea    D71(%rip),%rdi
  xor    %eax,%eax
  movss  %xmm3,0x30(%rsp)
  call   <printf@plt>
  mov    0x10(%rsp),%rsi
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  movzbl 0x2f(%rsp),%eax
  and    $0xffffffdf,%eax
  cmp    $0x59,%al
  jne    L12
L138:
  mov    %r15,%rdi
  pxor   %xmm0,%xmm0
  mov    $0x1,%eax
  cvtss2sd 0x30(%rsp),%xmm0
  call   <printf@plt>
  mov    %r14,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r13,%rsi
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  mov    %r12,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x18(%rsp),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  movzbl 0x2e(%rsp),%eax
  cmp    $0x2d,%al
  je     L69
  jle    L0
  cmp    $0x2f,%al
  je     L101
  cmp    $0x5e,%al
  jne    L24
  movss  0x34(%rsp),%xmm1
  movss  0x30(%rsp),%xmm0
  call   <pow@plt>
  movsbl 0x2e(%rsp),%esi
  pxor   %xmm2,%xmm2
  pxor   %xmm1,%xmm1
  movss  %xmm0,0xc(%rsp)
  mov    $0x3,%eax
  pxor   %xmm0,%xmm0
  lea    D86(%rip),%rdi
  cvtss2sd 0x30(%rsp),%xmm0
  cvtss2sd 0xc(%rsp),%xmm2
  cvtss2sd 0x34(%rsp),%xmm1
  call   <printf@plt>
  jmp    L10
  nop
L69:
  movss  0x30(%rsp),%xmm0
  movss  0x34(%rsp),%xmm1
  pxor   %xmm2,%xmm2
  mov    $0x2d,%esi
  lea    D86(%rip),%rdi
  mov    $0x3,%eax
  movaps %xmm0,%xmm5
  cvtss2sd %xmm0,%xmm0
  subss  %xmm1,%xmm5
  cvtss2sd %xmm1,%xmm1
  movss  %xmm5,0xc(%rsp)
  cvtss2sd %xmm5,%xmm2
  call   <printf@plt>
  jmp    L10
L24:
  lea    D129(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L10
  nopw   0x0(%rax,%rax,1)
L55:
  movss  0x30(%rsp),%xmm0
  movss  0x34(%rsp),%xmm1
  pxor   %xmm2,%xmm2
  mov    $0x2a,%esi
  lea    D86(%rip),%rdi
  mov    $0x3,%eax
  movaps %xmm0,%xmm7
  cvtss2sd %xmm0,%xmm0
  mulss  %xmm1,%xmm7
  cvtss2sd %xmm1,%xmm1
  movss  %xmm7,0xc(%rsp)
  cvtss2sd %xmm7,%xmm2
  call   <printf@plt>
  jmp    L10
  nopl   0x0(%rax)
L101:
  movss  0x30(%rsp),%xmm0
  movss  0x34(%rsp),%xmm1
  pxor   %xmm2,%xmm2
  mov    $0x2f,%esi
  lea    D86(%rip),%rdi
  mov    $0x3,%eax
  movaps %xmm0,%xmm6
  cvtss2sd %xmm0,%xmm0
  divss  %xmm1,%xmm6
  cvtss2sd %xmm1,%xmm1
  movss  %xmm6,0xc(%rsp)
  cvtss2sd %xmm6,%xmm2
  call   <printf@plt>
  jmp    L10
  nopl   0x0(%rax)
L12:
  mov    0x38(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L27
  add    $0x48,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L27:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D10
data_type: string
name: retrieve_data
arguments: label: D102
data_type: string
name: retrieve_data
arguments: label: D1
data_type: string
name: retrieve_data
arguments: label: D39
data_type: string
name: retrieve_data
arguments: label: D43
data_type: string
name: retrieve_data
arguments: label: D62
data_type: string
name: retrieve_data
arguments: label: D86
data_type: string
name: retrieve_data
arguments: label: D71
data_type: string
name: retrieve_data
arguments: label: D129
data_type: string

tool: D10: Masukan bilangan pertama untuk dihitung: 

tool: D102: %f

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

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

tool: D43: %s

tool: D62: Masukan bilangan kedua untuk dihitung: 

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

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

tool: D129: 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;
}
```