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

```asm
<main>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%r12
  cmp    $0x2,%edi
  jne    L96
L47:
  mov    0x8(%r12),%rdi
  call   <atoi@plt>
  mulss  D68(%rip),%xmm0
  divss  D51(%rip),%xmm0
  mov    $0x0,%ebx
L71:
  add    $0x1,%ebx
  pxor   %xmm1,%xmm1
  cvtsi2ss %ebx,%xmm1
  mulss  %xmm0,%xmm1
  cvttss2si %xmm1,%ebp
  pxor   %xmm2,%xmm2
  cvtsi2ss %ebp,%xmm2
  ucomiss %xmm1,%xmm2
  jp     L22
  je     L88
L22:
  cmp    $0xff,%ebx
  jg     L88
  cmp    $0xff,%ebp
  jle    L71
L88:
  cmp    $0xff,%ebx
  ja     L97
L85:
  lea    -0x3(%rbp),%eax
  cmp    $0xfc,%eax
  ja     L72
L91:
  mov    0x8(%r12),%rsi
  lea    D76(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebp,%edx
  mov    %ebp,%esi
  lea    D69(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebx,%edx
  mov    %ebx,%esi
  lea    D18(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movslq %ebx,%rbx
  shl    $0x8,%ebp
  movslq %ebp,%rsi
  add    %rbx,%rsi
  mov    %rsi,%rdx
  lea    D44(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D96(%rip),%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L96:
  mov    (%rsi),%rsi
  lea    D27(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L47
L97:
  mov    %ebx,%esi
  lea    D103(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D67(%rip),%rdi
  call   <puts@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L85
L72:
  mov    %ebp,%esi
  lea    D87(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D67(%rip),%rdi
  call   <puts@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L91
```

tool_calls: name: parse_data
arguments: data_label: D68
datatype: byte[4]
name: parse_data
arguments: data_label: D51
datatype: byte[4]
name: parse_data
arguments: data_label: D76
datatype: string
name: parse_data
arguments: data_label: D69
datatype: string
name: parse_data
arguments: data_label: D18
datatype: string
name: parse_data
arguments: data_label: D44
datatype: string
name: parse_data
arguments: data_label: D96
datatype: string
name: parse_data
arguments: data_label: D27
datatype: string
name: parse_data
arguments: data_label: D103
datatype: string
name: parse_data
arguments: data_label: D67
datatype: string
name: parse_data
arguments: data_label: D87
datatype: string

tool: {"D68": [0x00,0x00,0x00,0x3f]}

tool: {"D51": [0x00,0x00,0xd8,0x41]}

tool: D76: frequ=%s


tool: D69: ndiv=%d (%x)


tool: D18: mdiv=%d (%x)


tool: D44: pll0_ndiv_mdiv for module=%ld (%lx)


tool: D96: frequenz is ok

tool: D27: usage: %s frequenz


tool: D103: mdiv not correct (%d)


tool: D67: frequenz can't be used

tool: D87: ndiv not correct (%d)


assistant: ```c
main(int argc, char *argv[]) {
  int ndiv = 0, mdiv = 0;
  float frequ = 0, frequ_check = 1;
  unsigned long ndiv_mdiv = 0;
  if (argc != 2) {
    printf("usage: %s frequenz\n", argv[0]);
    exit(1);
  }
  frequ = atoi(argv[1]);
  frequ = frequ / 2 / 27;
  while (frequ_check != ndiv && mdiv <= 255 && ndiv <= 255) {
    mdiv++;
    frequ_check = frequ * mdiv;
    ndiv = frequ_check;
  }
  if (mdiv < 0 || mdiv > 255) {
    printf("mdiv not correct (%d)\n", mdiv);
    printf("frequenz can't be used\n");
    exit(1);
  }
  if (ndiv < 3 || ndiv > 255) {
    printf("ndiv not correct (%d)\n", ndiv);
    printf("frequenz can't be used\n");
    exit(1);
  }
  printf("frequ=%s\n", argv[1]);
  printf("ndiv=%d (%x)\n", ndiv, ndiv);
  printf("mdiv=%d (%x)\n", mdiv, mdiv);
  ndiv_mdiv = mdiv;
  ndiv_mdiv += (ndiv << 8);
  printf("pll0_ndiv_mdiv for module=%ld (%lx)\n", ndiv_mdiv, ndiv_mdiv);
  printf("frequenz is ok\n");
}
```