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

```asm
<ex10>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <print@plt>
  lea    D62(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x20(%rbp),%rax
  mov    %rax,%rsi
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
  jmp    L21
L100:
  lea    D84(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x20(%rbp),%rax
  mov    %rax,%rsi
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
L21:
  movss  -0x20(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  seta   %al
  xor    $0x1,%eax
  test   %al,%al
  jne    L100
  lea    D123(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x1c(%rbp),%rax
  mov    %rax,%rsi
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
  jmp    L84
L90:
  lea    D84(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x1c(%rbp),%rax
  mov    %rax,%rsi
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
L84:
  movss  -0x1c(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  seta   %al
  xor    $0x1,%eax
  test   %al,%al
  jne    L90
  movl   $0x0,-0x18(%rbp)
  movabs $0x4847464544434241,%rax
  mov    %rax,-0x12(%rbp)
  movw   $0x49,-0xa(%rbp)
  movss  -0x20(%rbp),%xmm0
  comiss D61(%rip),%xmm0
  jbe    L28
  addl   $0x6,-0x18(%rbp)
  jmp    L13
L28:
  movss  -0x20(%rbp),%xmm0
  comiss D58(%rip),%xmm0
  jbe    L13
  addl   $0x3,-0x18(%rbp)
L13:
  movss  -0x1c(%rbp),%xmm0
  cvtss2sd %xmm0,%xmm0
  comisd D25(%rip),%xmm0
  jbe    L32
  addl   $0x2,-0x18(%rbp)
  jmp    L8
L32:
  movss  -0x1c(%rbp),%xmm0
  cvtss2sd %xmm0,%xmm0
  comisd D27(%rip),%xmm0
  jb     L8
  addl   $0x1,-0x18(%rbp)
L8:
  mov    -0x18(%rbp),%eax
  cltq
  movzbl -0x12(%rbp,%rax,1),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D104(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <print@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L49
  call   <__stack_chk_fail@plt>
L49:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D9
data_type: string
name: read_data
arguments: data_label: D62
data_type: string
name: read_data
arguments: data_label: D83
data_type: string
name: read_data
arguments: data_label: D84
data_type: string
name: read_data
arguments: data_label: D123
data_type: string
name: read_data
arguments: data_label: D61
data_type: byte[4]
name: read_data
arguments: data_label: D58
data_type: byte[4]
name: read_data
arguments: data_label: D25
data_type: f64[2]
name: read_data
arguments: data_label: D27
data_type: f64
name: read_data
arguments: data_label: D104
data_type: string

tool: D9: 
------------------------------


tool: D62: Informe o peso: 

tool: D83: %f

tool: D84: Valor invalido, tente novamente: 

tool: D123: Informe a altura: 

tool: {"D61": [0x00,0x00,0xb4,0x42]}

tool: {"D58": [0x00,0x00,0x70,0x42]}

tool: {"D25": [1.7,1.2]}

tool: D27: 1.2

tool: D104: Sua classificacao e: %c


assistant: ```c
void ex10() {
  print("\n------------------------------\n");
  float peso, altura;
  printf("Informe o peso: ");
  scanf("%f", &peso);
  while (!(peso > 0)) {
    printf("Valor invalido, tente novamente: ");
    scanf("%f", &peso);
  }
  printf("Informe a altura: ");
  scanf("%f", &altura);
  while (!(altura > 0)) {
    printf("Valor invalido, tente novamente: ");
    scanf("%f", &altura);
  }
  int grupo = 0;
  char grupos[10] = "ABCDEFGHI";
  if (peso > 90)
    grupo += 6;
  else if (peso > 60)
    grupo += 3;
  if (altura > 1.7)
    grupo += 2;
  else if (altura >= 1.2)
    grupo++;
  printf("Sua classificacao e: %c\n", grupos[grupo]);
  print("\n------------------------------\n");
}
```