user: Demonstrate the C code that generates the assembly output below:

```asm
<ex5>:
  endbr64
  push   %r13
  push   %r12
  lea    D85(%rip),%r12
  push   %rbp
  mov    %r12,%rdi
  push   %rbx
  lea    D39(%rip),%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0xc(%rsp),%r13
  call   <print@plt>
  lea    D11(%rip),%rdi
  call   <print@plt>
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0xc(%rsp),%esi
  test   %esi,%esi
  jg     L51
  lea    D38(%rip),%rbp
  nop
L44:
  mov    %rbp,%rdi
  call   <print@plt>
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0xc(%rsp),%ecx
  test   %ecx,%ecx
  jle    L44
L51:
  lea    D12(%rip),%rdi
  lea    0x10(%rsp),%r13
  call   <print@plt>
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x10(%rsp),%edx
  test   %edx,%edx
  jg     L20
  lea    D38(%rip),%rbp
  cs nopw 0x0(%rax,%rax,1)
L29:
  mov    %rbp,%rdi
  call   <print@plt>
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x10(%rsp),%eax
  test   %eax,%eax
  jle    L29
L20:
  lea    D50(%rip),%rdi
  lea    0x14(%rsp),%r13
  call   <print@plt>
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x14(%rsp),%eax
  test   %eax,%eax
  jg     L8
  lea    D38(%rip),%rbp
  cs nopw 0x0(%rax,%rax,1)
L11:
  mov    %rbp,%rdi
  call   <print@plt>
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x14(%rsp),%eax
  test   %eax,%eax
  jle    L11
L8:
  mov    0xc(%rsp),%edx
  add    0x10(%rsp),%edx
  pxor   %xmm1,%xmm1
  pxor   %xmm2,%xmm2
  add    %eax,%edx
  cvtsi2ssl 0xc(%rsp),%xmm2
  pxor   %xmm3,%xmm3
  cvtsi2sd %edx,%xmm1
  mulsd  D80(%rip),%xmm1
  cvtsi2ssl 0x10(%rsp),%xmm3
  cvtsd2ss %xmm1,%xmm1
  movaps %xmm1,%xmm0
  subss  %xmm2,%xmm0
  movaps %xmm1,%xmm2
  subss  %xmm3,%xmm2
  mulss  %xmm1,%xmm0
  mulss  %xmm2,%xmm0
  pxor   %xmm2,%xmm2
  cvtsi2ss %eax,%xmm2
  subss  %xmm2,%xmm1
  mulss  %xmm1,%xmm0
  call   <sqrt@plt>
  lea    D22(%rip),%rdi
  call   <printf@plt>
  mov    %r12,%rdi
  call   <print@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L25
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L25:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D85
data_type: string
name: retrieve_data
arguments: label: D39
data_type: string
name: retrieve_data
arguments: label: D11
data_type: string
name: retrieve_data
arguments: label: D38
data_type: string
name: retrieve_data
arguments: label: D12
data_type: string
name: retrieve_data
arguments: label: D50
data_type: string
name: retrieve_data
arguments: label: D80
data_type: byte[8]
name: retrieve_data
arguments: label: D22
data_type: string

tool: D85: 
------------------------------


tool: D39: %d

tool: D11: Informe a medida do lado a:

tool: D38: Valor invalido, tente novamente:

tool: D12: Informe a medida do lado b:

tool: D50: Informe a medida do lado c:

tool: {"D80": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

tool: D22: A area do triangulo e: %.2f u.a.


assistant: ```c
void ex5() {
  print("\n------------------------------\n");
  int a, b, c;
  print("Informe a medida do lado a:");
  scanf("%d", &a);
  while (!(a > 0)) {
    print("Valor invalido, tente novamente:");
    scanf("%d", &a);
  }
  print("Informe a medida do lado b:");
  scanf("%d", &b);
  while (!(b > 0)) {
    print("Valor invalido, tente novamente:");
    scanf("%d", &b);
  }
  print("Informe a medida do lado c:");
  scanf("%d", &c);
  while (!(c > 0)) {
    print("Valor invalido, tente novamente:");
    scanf("%d", &c);
  }
  float s = (a + b + c) / 2.;
  float area = sqrt(s * (s - a) * (s - b) * (s - c));
  printf("A area do triangulo e: %.2f u.a.\n", area);
  print("\n------------------------------\n");
}
```