user: Please show me the C implementation that matches the assembly code listed below:

```asm
<subtrai>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  mov    $0x28,%edi
  push   %r13
  push   %r12
  push   %rbp
  mov    %rcx,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x18,%rsp
  mov    %rdx,0x8(%rsp)
  call   <malloc@plt>
  mov    %rax,%r13
  mov    %rax,%rdi
  call   <inicializa_polinomio@plt>
  mov    (%r14),%rcx
  mov    %r13,%rdx
  mov    %r13,%r12
  neg    %rdx
  lea    0x28(%r13),%rsi
  mov    %r13,%rax
  add    %rdx,%rcx
  add    (%rbx),%rdx
  xchg   %ax,%ax
L139:
  movss  (%rcx,%rax,1),%xmm0
  subss  (%rdx,%rax,1),%xmm0
  add    $0x4,%rax
  movss  %xmm0,-0x4(%rax)
  cmp    %rsi,%rax
  jne    L139
  lea    D44(%rip),%r14
  xor    %eax,%eax
  mov    $0x1,%ebx
  mov    %r14,%rdi
  lea    D32(%rip),%r15
  call   <printf@plt>
  mov    0x0(%rbp),%rcx
  mov    %r14,%rdi
  mov    $0xe,%edx
  mov    $0x1,%esi
  lea    0x4(%r13),%r14
  call   <fwrite@plt>
  xor    %r9d,%r9d
  jmp    L12
  nopl   0x0(%rax)
L62:
  mov    %ebx,%esi
  lea    D2(%rip),%rdi
  mov    $0x1,%eax
  cvtss2sd %xmm0,%xmm0
  call   <printf@plt>
  mov    0x0(%rbp),%rdi
  pxor   %xmm0,%xmm0
  mov    %ebx,%edx
  lea    D2(%rip),%rsi
  mov    $0x1,%eax
  cvtss2sd (%r14),%xmm0
  call   <fprintf@plt>
  mov    $0x1,%r9d
L120:
  add    $0x1,%ebx
  add    $0x4,%r14
  cmp    $0xa,%ebx
  je     L106
L12:
  movss  (%r14),%xmm0
  pxor   %xmm3,%xmm3
  ucomiss %xmm3,%xmm0
  jp     L57
  je     L120
L57:
  test   %r9d,%r9d
  je     L62
  mov    %ebx,%esi
  mov    %r15,%rdi
  mov    $0x1,%eax
  mov    %r9d,(%rsp)
  cvtss2sd %xmm0,%xmm0
  call   <printf@plt>
  mov    0x0(%rbp),%rdi
  mov    %ebx,%edx
  pxor   %xmm0,%xmm0
  mov    %r15,%rsi
  mov    $0x1,%eax
  add    $0x1,%ebx
  cvtss2sd (%r14),%xmm0
  call   <fprintf@plt>
  add    $0x4,%r14
  mov    (%rsp),%r9d
  cmp    $0xa,%ebx
  jne    L12
L106:
  movss  0x0(%r13),%xmm0
  pxor   %xmm4,%xmm4
  ucomiss %xmm4,%xmm0
  jp     L167
  je     L54
L167:
  lea    D12(%rip),%r14
  cvtss2sd %xmm0,%xmm0
  test   %r9d,%r9d
  jne    L95
L17:
  mov    %r14,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  mov    0x0(%rbp),%rdi
  pxor   %xmm0,%xmm0
  mov    %r14,%rsi
  mov    $0x1,%eax
  cvtss2sd 0x0(%r13),%xmm0
  call   <fprintf@plt>
L37:
  mov    $0xa,%edi
  xor    %ebx,%ebx
  call   <putchar@plt>
  mov    0x0(%rbp),%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
  pxor   %xmm1,%xmm1
  jmp    L59
  nopw   0x0(%rax,%rax,1)
L20:
  add    $0x1,%ebx
  add    $0x4,%r12
  cmp    $0xa,%ebx
  je     L144
L59:
  movss  (%r12),%xmm0
  pxor   %xmm2,%xmm2
  ucomiss %xmm2,%xmm0
  jp     L166
  je     L20
L166:
  mov    0x8(%rsp),%rax
  mov    %ebx,%edi
  movss  %xmm1,(%rsp)
  add    $0x1,%ebx
  add    $0x4,%r12
  mulss  (%rax),%xmm0
  call   <pow@plt>
  pxor   %xmm0,%xmm0
  movss  (%rsp),%xmm1
  cvtsi2ss %rax,%xmm0
  addss  %xmm0,%xmm1
  cmp    $0xa,%ebx
  jne    L59
L144:
  lea    D10(%rip),%r12
  pxor   %xmm0,%xmm0
  mov    $0x1,%eax
  mov    %r12,%rdi
  cvtss2sd %xmm1,%xmm0
  movsd  %xmm0,(%rsp)
  call   <printf@plt>
  mov    0x0(%rbp),%rdi
  movsd  (%rsp),%xmm0
  add    $0x18,%rsp
  pop    %rbx
  mov    %r12,%rsi
  pop    %rbp
  mov    $0x1,%eax
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1100 <fprintf@plt>
  nopl   (%rax)
L95:
  lea    D69(%rip),%r14
  jmp    L17
  nopl   0x0(%rax)
L54:
  mov    $0x30,%edi
  call   <putchar@plt>
  mov    0x0(%rbp),%rsi
  mov    $0x30,%edi
  call   <fputc@plt>
  jmp    L37
```

tool_calls: name: unpack_data
arguments: label: D44
datatype: string
name: unpack_data
arguments: label: D32
datatype: string
name: unpack_data
arguments: label: D2
datatype: string
name: unpack_data
arguments: label: D12
datatype: string
name: unpack_data
arguments: label: D10
datatype: string
name: unpack_data
arguments: label: D69
datatype: string

tool: D44: Subtracao P-Q=

tool: D32: %+.2fx%d

tool: D2: %.2fx%d

tool: D12: %.2f

tool: D10: Subtracao(2.3)=%.2f


tool: D69: %+.2f

assistant: ```c
void subtrai(float **polinomio1, float **polinomio2, float *x, FILE **saida) {
  int i = 0, cont = 0;
  float *polinomio = NULL;
  float subtracao = 0;
  polinomio = (float *)malloc(10 * sizeof(float));
  inicializa_polinomio(polinomio);
  for (i = 0; i < 10; i++) {
    *(polinomio + i) = *(*polinomio1 + i) - *(*polinomio2 + i);
  }
  printf("Subtracao P-Q=");
  fprintf(*saida, "Subtracao P-Q=");
  for (i = 1; i < 10; i++) {
    if (*(polinomio + i) != 0.0) {
      if (cont == 0) {
        printf("%.2fx%d", *(polinomio + i), i);
        fprintf(*saida, "%.2fx%d", *(polinomio + i), i);
        cont = 1;
      } else {
        printf("%+.2fx%d", *(polinomio + i), i);
        fprintf(*saida, "%+.2fx%d", *(polinomio + i), i);
      }
    }
  }
  if (*(polinomio + 0) != 0.0) {
    if (cont == 0) {
      printf("%.2f", *(polinomio + 0));
      fprintf(*saida, "%.2f", *(polinomio + 0));
    } else {
      printf("%+.2f", *(polinomio + 0));
      fprintf(*saida, "%+.2f", *(polinomio + 0));
    }
  } else {
    printf("0");
    fprintf(*saida, "0");
  }
  printf("\n");
  fprintf(*saida, "\n");
  for (i = 0; i < 10; i++) {
    if (*(polinomio + i) != 0.0) {
      subtracao += pow(*(polinomio + i) * *x, i);
    }
  }
  printf("Subtracao(2.3)=%.2f\n", subtracao);
  fprintf(*saida, "Subtracao(2.3)=%.2f\n", subtracao);
}
```