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

```asm
<analyse_param>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    0xd0(%rsp),%rax
  mov    %rdx,(%rsp)
  mov    %rcx,0x40(%rsp)
  mov    %rax,0x38(%rsp)
  mov    0xd8(%rsp),%rax
  mov    %r8,0x50(%rsp)
  mov    %rax,0x10(%rsp)
  mov    0xe0(%rsp),%rax
  mov    %r9,0x48(%rsp)
  mov    %rax,0x8(%rsp)
  mov    0xe8(%rsp),%rax
  mov    %rax,0x58(%rsp)
  mov    0xf0(%rsp),%rax
  mov    %rax,0x60(%rsp)
  mov    0xf8(%rsp),%rax
  mov    %rax,0x68(%rsp)
  mov    0x100(%rsp),%rax
  mov    %rax,0x70(%rsp)
  mov    0x108(%rsp),%rax
  mov    %rax,0x78(%rsp)
  mov    0x110(%rsp),%rax
  mov    %rax,0x18(%rsp)
  mov    0x118(%rsp),%rax
  mov    %rax,0x20(%rsp)
  mov    0x120(%rsp),%rax
  mov    %rax,0x80(%rsp)
  cmp    $0x1,%edi
  jle    L18
  movl   $0x0,0x30(%rsp)
  mov    %edi,%ebx
  mov    %rsi,%rbp
  mov    $0x1,%r14d
  movl   $0x0,0x28(%rsp)
  lea    D105(%rip),%r13
  lea    D111(%rip),%r12
  lea    D14(%rip),%r15
  nopl   0x0(%rax,%rax,1)
L257:
  movslq %r14d,%rax
  lea    0x0(,%rax,8),%rdx
  mov    0x0(%rbp,%rax,8),%rax
  cmpb   $0x2d,(%rax)
  jne    L381
  movzbl 0x1(%rax),%eax
  add    $0x1,%r14d
  sub    $0x43,%eax
  cmp    $0x33,%al
  ja     L650
  movzbl %al,%eax
  movslq (%r12,%rax,4),%rax
  add    %r12,%rax
  notrack jmp *%rax
  nopl   (%rax)
L381:
  xor    %edx,%edx
  xor    %esi,%esi
  mov    %r13,%rdi
  add    $0x1,%r14d
  call   <print_error_lfmm@plt>
L83:
  cmp    %r14d,%ebx
  jg     L257
L602:
  mov    0x18(%rsp),%rax
  cmpl   $0xffffffff,(%rax)
  je     L45
L413:
  mov    0x20(%rsp),%rax
  cmpl   $0xffffffff,(%rax)
  je     L32
L540:
  mov    0x28(%rsp),%r10d
  test   %r10d,%r10d
  je     L220
L539:
  mov    (%rsp),%rax
  mov    (%rax),%r9d
  test   %r9d,%r9d
  je     L538
  mov    0x38(%rsp),%rax
  mov    (%rax),%r8d
  test   %r8d,%r8d
  jne    L204
L538:
  xor    %edx,%edx
  xor    %esi,%esi
  lea    D0(%rip),%rdi
  call   <print_error_lfmm@plt>
L222:
  mov    0x30(%rsp),%eax
  test   %eax,%eax
  je     L297
  mov    0x40(%rsp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jle    L234
  mov    (%rsp),%rbx
  cmp    (%rbx),%eax
  jg     L234
L297:
  mov    0x10(%rsp),%rcx
  mov    0x8(%rsp),%rax
  mov    (%rcx),%ecx
  cmp    %ecx,(%rax)
  jge    L327
L748:
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L650:
  xor    %edx,%edx
  xor    %esi,%esi
  mov    %r13,%rdi
  call   <print_error_lfmm@plt>
  jmp    L83
  nopl   0x0(%rax)
L204:
  mov    0x48(%rsp),%rax
  mov    (%rax),%edi
  test   %edi,%edi
  je     L538
  mov    0x50(%rsp),%rax
  mov    (%rax),%esi
  test   %esi,%esi
  je     L538
  mov    0x8(%rsp),%rax
  mov    (%rax),%ecx
  test   %ecx,%ecx
  je     L538
  mov    0x10(%rsp),%rax
  mov    (%rax),%edx
  test   %edx,%edx
  jne    L222
  jmp    L538
  nopl   0x0(%rax)
L234:
  xor    %edx,%edx
  lea    D173(%rip),%rsi
  lea    D7(%rip),%rdi
  call   <print_error_lfmm@plt>
  mov    0x10(%rsp),%rcx
  mov    0x8(%rsp),%rax
  mov    (%rcx),%ecx
  cmp    %ecx,(%rax)
  jl     L748
L327:
  add    $0x98,%rsp
  xor    %edx,%edx
  lea    D59(%rip),%rsi
  pop    %rbx
  lea    D7(%rip),%rdi
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10b0 <print_error_lfmm@plt>
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L667
  mov    (%rcx),%rsi
  cmpb   $0x2d,(%rsi)
  je     L667
L29:
  mov    0x20(%rsp),%rax
  mov    0x70(%rsp),%rdi
  add    $0x1,%r14d
  movl   $0x0,(%rax)
  call   <strcpy@plt>
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L273
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L273
L80:
  call   <atoi@plt>
  mov    0x80(%rsp),%rcx
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L142
  mov    (%rcx),%rsi
  cmpb   $0x2d,(%rsi)
  je     L142
L537:
  mov    0x60(%rsp),%rdi
  add    $0x1,%r14d
  call   <strcpy@plt>
  movl   $0x1,0x28(%rsp)
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L451
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L451
  call   <atoi@plt>
  mov    0x50(%rsp),%rcx
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  mov    0x58(%rsp),%rax
  movl   $0x1,(%rax)
  jmp    L83
  xor    %eax,%eax
  call   <print_licence@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L54
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L54
  call   <atoi@plt>
  mov    0x10(%rsp),%rcx
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  xor    %eax,%eax
  call   <print_help@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L101
  mov    (%rcx),%rsi
  cmpb   $0x2d,(%rsi)
  je     L101
L236:
  mov    0x18(%rsp),%rax
  mov    0x68(%rsp),%rdi
  add    $0x1,%r14d
  movl   $0x0,(%rax)
  call   <strcpy@plt>
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L471
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L471
L349:
  call   <atoi@plt>
  mov    0x40(%rsp),%rcx
  movl   $0x1,0x30(%rsp)
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L665
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L665
  call   <atoi@plt>
  mov    0x8(%rsp),%rcx
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L416
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L416
  call   <atoi@plt>
  mov    0x48(%rsp),%rcx
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L425
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L425
  call   <atoi@plt>
  mov    0x38(%rsp),%rcx
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L363
  mov    (%rcx),%rdi
  cmpb   $0x2d,(%rdi)
  je     L363
  call   <atoi@plt>
  mov    (%rsp),%rcx
  add    $0x1,%r14d
  mov    %eax,(%rcx)
  jmp    L83
  lea    0x8(%rbp,%rdx,1),%rcx
  cmp    %r14d,%ebx
  je     L180
  mov    (%rcx),%rsi
  cmpb   $0x2d,(%rsi)
  je     L180
  mov    0x78(%rsp),%rdi
  add    $0x1,%r14d
  call   <strcpy@plt>
  jmp    L83
  nop
L220:
  xor    %edx,%edx
  lea    D79(%rip),%rsi
  lea    D186(%rip),%rdi
  call   <print_error_lfmm@plt>
  jmp    L539
  nopw   0x0(%rax,%rax,1)
L32:
  xor    %edx,%edx
  lea    D171(%rip),%rsi
  lea    D186(%rip),%rdi
  call   <print_error_lfmm@plt>
  jmp    L540
  nopw   0x0(%rax,%rax,1)
L45:
  xor    %edx,%edx
  lea    D64(%rip),%rsi
  lea    D186(%rip),%rdi
  call   <print_error_lfmm@plt>
  jmp    L413
  nopw   0x0(%rax,%rax,1)
L180:
  xor    %edx,%edx
  lea    D62(%rip),%rsi
  mov    %r15,%rdi
  add    $0x1,%r14d
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    0x78(%rsp),%rdi
  mov    (%rcx),%rsi
  call   <strcpy@plt>
  jmp    L83
  nopw   0x0(%rax,%rax,1)
L363:
  xor    %edx,%edx
  lea    D78(%rip),%rsi
  mov    %r15,%rdi
  add    $0x1,%r14d
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rdi
  call   <atoi@plt>
  mov    (%rsp),%rcx
  mov    %eax,(%rcx)
  jmp    L83
  nopl   0x0(%rax,%rax,1)
L425:
  xor    %edx,%edx
  lea    D61(%rip),%rsi
  mov    %r15,%rdi
  add    $0x1,%r14d
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rdi
  call   <atoi@plt>
  mov    0x38(%rsp),%rcx
  mov    %eax,(%rcx)
  jmp    L83
  nopl   0x0(%rax)
L416:
  xor    %edx,%edx
  lea    D86(%rip),%rsi
  mov    %r15,%rdi
  add    $0x1,%r14d
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rdi
  call   <atoi@plt>
  mov    0x48(%rsp),%rcx
  mov    %eax,(%rcx)
  jmp    L83
  nopl   0x0(%rax)
L665:
  xor    %edx,%edx
  lea    D134(%rip),%rsi
  mov    %r15,%rdi
  add    $0x1,%r14d
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rdi
  call   <atoi@plt>
  mov    0x8(%rsp),%rcx
  mov    %eax,(%rcx)
  jmp    L83
  nopl   0x0(%rax)
L471:
  mov    %r15,%rdi
  xor    %edx,%edx
  mov    %rcx,0x30(%rsp)
  lea    D95(%rip),%rsi
  call   <print_error_lfmm@plt>
  mov    0x30(%rsp),%rcx
  mov    (%rcx),%rdi
  jmp    L349
  nopl   0x0(%rax,%rax,1)
L101:
  lea    D92(%rip),%rsi
  xor    %edx,%edx
  mov    %r15,%rdi
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rsi
  jmp    L236
  nopl   0x0(%rax)
L54:
  xor    %edx,%edx
  lea    D93(%rip),%rsi
  mov    %r15,%rdi
  add    $0x1,%r14d
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rdi
  call   <atoi@plt>
  mov    0x10(%rsp),%rcx
  mov    %eax,(%rcx)
  jmp    L83
  nopl   0x0(%rax)
L451:
  xor    %edx,%edx
  lea    D161(%rip),%rsi
  mov    %r15,%rdi
  add    $0x1,%r14d
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rdi
  call   <atoi@plt>
  mov    0x50(%rsp),%rcx
  mov    %eax,(%rcx)
  jmp    L83
  nopl   0x0(%rax)
L142:
  lea    D35(%rip),%rsi
  xor    %edx,%edx
  mov    %r15,%rdi
  mov    %rcx,0x28(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x28(%rsp),%rcx
  mov    (%rcx),%rsi
  jmp    L537
  nopl   0x0(%rax,%rax,1)
L273:
  mov    %r15,%rdi
  xor    %edx,%edx
  lea    D196(%rip),%rsi
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rdi
  jmp    L80
  nopl   0x0(%rax)
L667:
  lea    D174(%rip),%rsi
  xor    %edx,%edx
  mov    %r15,%rdi
  mov    %rcx,0x88(%rsp)
  call   <print_error_lfmm@plt>
  mov    0x88(%rsp),%rcx
  mov    (%rcx),%rsi
  jmp    L29
  nopl   0x0(%rax)
L18:
  movl   $0x0,0x30(%rsp)
  movl   $0x0,0x28(%rsp)
  jmp    L602
```

tool_calls: name: read_data
arguments: data_tag: D105
type_guessed: string
name: read_data
arguments: data_tag: D14
type_guessed: string
name: read_data
arguments: data_tag: D0
type_guessed: string
name: read_data
arguments: data_tag: D173
type_guessed: string
name: read_data
arguments: data_tag: D7
type_guessed: string
name: read_data
arguments: data_tag: D59
type_guessed: string
name: read_data
arguments: data_tag: D79
type_guessed: string
name: read_data
arguments: data_tag: D186
type_guessed: string
name: read_data
arguments: data_tag: D171
type_guessed: string
name: read_data
arguments: data_tag: D64
type_guessed: string
name: read_data
arguments: data_tag: D62
type_guessed: string
name: read_data
arguments: data_tag: D78
type_guessed: string
name: read_data
arguments: data_tag: D61
type_guessed: string
name: read_data
arguments: data_tag: D86
type_guessed: string
name: read_data
arguments: data_tag: D134
type_guessed: string
name: read_data
arguments: data_tag: D95
type_guessed: string
name: read_data
arguments: data_tag: D92
type_guessed: string
name: read_data
arguments: data_tag: D93
type_guessed: string
name: read_data
arguments: data_tag: D161
type_guessed: string
name: read_data
arguments: data_tag: D35
type_guessed: string
name: read_data
arguments: data_tag: D196
type_guessed: string
name: read_data
arguments: data_tag: D174
type_guessed: string

tool: D105: basic

tool: D14: cmd

tool: D0: missing

tool: D173: (-d option). d should be between 1 and D

tool: D7: specific

tool: D59: the number of iterations for burnin (b) is greater than the number total of iterations (i)

tool: D79: -o output_file

tool: D186: option

tool: D171: -v variable_file

tool: D64: -g genotype_file

tool: D62: C (DIC file)

tool: D78: D (number of covariables)

tool: D61: K (number of latent factors)

tool: D86: L (number of SNPs)

tool: D134: b (burn parameter in the GS)

tool: D95: d (numerous of the covariable)

tool: D92: g (genotype file)

tool: D93: i (number of iterations in the GS)

tool: D161: n (number of individuals)

tool: D35: o (output file with z-scores)

tool: D196: p (number of processes used)

tool: D174: v (variable file)

assistant: ```c
void analyse_param(int argc, char *argv[], int *D, int *d, int *N, int *M, int *K, int *Niter, int *burn, int *m, char *output, char *input, char *cov_file, char *dev_file, int *g_data, int *g_cov, int *num_thrd) {
  int i;
  int out = 0;
  int dOk = 0;
  for (i = 1; i < argc; i++) {
    if (argv[i][0] == '-') {
      switch (argv[i][1]) {
      case 'D':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "D (number of covariables)", 0);
        *D = atoi(argv[i]);
        break;
      case 'd':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "d (numerous of the covariable)", 0);
        *d = atoi(argv[i]);
        dOk = 1;
        break;
      case 'n':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "n (number of individuals)", 0);
        *N = atoi(argv[i]);
        break;
      case 'L':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "L (number of SNPs)", 0);
        *M = atoi(argv[i]);
        break;
      case 'K':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "K (number of latent factors)", 0);
        *K = atoi(argv[i]);
        break;
      case 'i':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "i (number of iterations in the GS)", 0);
        *Niter = atoi(argv[i]);
        break;
      case 'm':
        *m = 1;
        break;
      case 'h':
        print_help();
        exit(1);
        break;
      case 'l':
        print_licence();
        exit(1);
        break;
      case 'b':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "b (burn parameter in the GS)", 0);
        *burn = atoi(argv[i]);
        break;
      case 'p':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "p (number of processes used)", 0);
        *num_thrd = atoi(argv[i]);
        break;
      case 'o':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "o (output file with z-scores)", 0);
        strcpy(output, argv[i]);
        out = 1;
        break;
      case 'g':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "g (genotype file)", 0);
        *g_data = 0;
        strcpy(input, argv[i]);
        break;
      case 'C':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "C (DIC file)", 0);
        strcpy(dev_file, argv[i]);
        break;
      case 'v':
        i++;
        if (argc == i || argv[i][0] == '-')
          print_error_lfmm("cmd", "v (variable file)", 0);
        *g_cov = 0;
        strcpy(cov_file, argv[i]);
        break;
      default:
        print_error_lfmm("basic", NULL, 0);
      }
    } else {
      print_error_lfmm("basic", NULL, 0);
    }
  }
  if (*g_data == -1)
    print_error_lfmm("option", "-g genotype_file", 0);
  if (*g_cov == -1)
    print_error_lfmm("option", "-v variable_file", 0);
  if (!out)
    print_error_lfmm("option", "-o output_file", 0);
  if (*D == 0 || *K == 0 || *M == 0 || *N == 0 || *burn == 0 || *Niter == 0)
    print_error_lfmm("missing", NULL, 0);
  if (dOk && (*d < 1 || *d > *D)) {
    print_error_lfmm("specific", "(-d option). d should be between 1 and D", 0);
  }
  if (*burn >= *Niter) {
    print_error_lfmm("specific",
                     "the number of iterations for burnin "
                     "(b) is greater than the number total of iterations (i)",
                     0);
  }
}
```