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

```asm
<pmecc_print_header>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D57(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x14(%rbp),%eax
  sar    $0x12,%eax
  and    $0x1ff,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D69(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x14(%rbp),%eax
  sar    $0x10,%eax
  and    $0x3,%eax
  test   %eax,%eax
  jne    L31
  mov    $0x200,%eax
  jmp    L29
L31:
  mov    $0x400,%eax
L29:
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D89(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x14(%rbp),%eax
  sar    $0xd,%eax
  and    $0x7,%eax
  cmp    $0x2,%eax
  jg     L22
  mov    -0x14(%rbp),%eax
  sar    $0xd,%eax
  and    $0x7,%eax
  mov    $0x2,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L30
L22:
  mov    -0x14(%rbp),%eax
  sar    $0xd,%eax
  and    $0x7,%eax
  sub    $0x3,%eax
  mov    $0xc,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0x4(%rbp)
L30:
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D63(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x14(%rbp),%eax
  sar    $0x4,%eax
  and    $0x1ff,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D27(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x14(%rbp),%eax
  sar    %eax
  and    $0x3,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D80(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x14(%rbp),%eax
  and    $0x1,%eax
  mov    %eax,%esi
  lea    D38(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D57(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  nop
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D5
data_type: string
name: unpack_data
arguments: tag: D57
data_type: string
name: unpack_data
arguments: tag: D69
data_type: string
name: unpack_data
arguments: tag: D89
data_type: string
name: unpack_data
arguments: tag: D63
data_type: string
name: unpack_data
arguments: tag: D27
data_type: string
name: unpack_data
arguments: tag: D80
data_type: string
name: unpack_data
arguments: tag: D38
data_type: string

tool: D5: PMECC header:

tool: D57: 		====================

tool: D69: 		eccOffset: %9i


tool: D89: 		sectorSize: %8i


tool: D63: 		eccBitReq: %9i


tool: D27: 		spareSize: %9i


tool: D80: 		nbSectorPerPage: %3i


tool: D38: 		usePmecc: %10i


assistant: ```c
void pmecc_print_header(const uint32_t word) {
  int val;
  printf("PMECC header:\n");
  printf("\t\t====================\n");
  val = (word >> 18) & 0x1ff;
  printf("\t\teccOffset: %9i\n", val);
  val = (((word >> 16) & 0x3) == 0) ? 512 : 1024;
  printf("\t\tsectorSize: %8i\n", val);
  if (((word >> 13) & 0x7) <= 2)
    val = (2 << ((word >> 13) & 0x7));
  else
    val = (12 << (((word >> 13) & 0x7) - 3));
  printf("\t\teccBitReq: %9i\n", val);
  val = (word >> 4) & 0x1ff;
  printf("\t\tspareSize: %9i\n", val);
  val = (1 << ((word >> 1) & 0x3));
  printf("\t\tnbSectorPerPage: %3i\n", val);
  printf("\t\tusePmecc: %10i\n", word & 0x1);
  printf("\t\t====================\n");
}
```