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

```asm
<FlashProgram>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbp
  mov    %rsi,%rbx
  mov    %rdx,%r12
  test   $0x3,%sil
  jne    L155
L39:
  test   $0x3,%r12b
  jne    L43
  movq   $0x1,0x400fd014
  mov    0x400fe1a0,%rax
  test   $0x1,%al
  jne    L9
  test   %r12,%r12
  je     L124
L14:
  mov    %rbx,%rax
  neg    %rax
  lea    0x0(%rbp,%rax,2),%r8
  mov    %rbx,%rsi
  mov    $0x400fd008,%ecx
  mov    $0xa4420001,%edi
  lea    (%rbx,%r12,1),%rdx
L70:
  mov    %rsi,0x400fd000
  mov    (%r8,%rsi,2),%rax
  mov    %rax,0x400fd004
  mov    %rdi,(%rcx)
L142:
  mov    (%rcx),%rax
  test   $0x1,%al
  jne    L142
  add    $0x4,%rsi
  cmp    %rdx,%rsi
  jne    L70
L124:
  mov    0x400fd00c,%rax
  and    $0x1,%eax
  neg    %rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L155:
  mov    $0xc8,%esi
  lea    D5(%rip),%rdi
  call   <AssertFailure@plt>
  jmp    L39
L43:
  mov    $0xc9,%esi
  lea    D5(%rip),%rdi
  call   <AssertFailure@plt>
  movq   $0x1,0x400fd014
  mov    0x400fe1a0,%rax
  test   $0x1,%al
  jne    L76
  jmp    L14
L9:
  test   %r12,%r12
  jne    L76
  jmp    L124
L13:
  test   %rax,%rax
  je     L113
  add    $0x8,%rbp
  mov    -0x8(%rbp),%rdx
  mov    %rdx,0x400fd100(%rcx)
  sub    $0x4,%rax
L88:
  mov    %rsi,%rdx
  sub    %rax,%rdx
  mov    %rdx,%rcx
  and    $0x7c,%ecx
  jne    L13
  mov    0x400fd030,%rdi
  test   %rdi,%rdi
  je     L13
L113:
  mov    $0xa4420001,%ebx
  mov    %rbx,0x400fd020
L19:
  mov    0x400fd020,%rcx
  test   $0x1,%cl
  jne    L19
  test   %rax,%rax
  je     L124
  mov    %rax,%r12
  mov    %rdx,%rbx
L76:
  mov    %rbx,%rax
  and    $0xffffffffffffff80,%rax
  mov    %rax,0x400fd000
  mov    %r12,%rax
  lea    (%rbx,%r12,1),%rsi
  jmp    L88
```

tool_calls: name: extract_symbolic_data
arguments: tag: D5
type_guessed: string

tool: D5: /scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AmesianX/OpenBLT/refs/heads/master/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/lib/driverlib/flashlib.c

assistant: ```c
long FlashProgram(unsigned long *pulData, unsigned long ulAddress, unsigned long ulCount) {
  {
    if (!(!(ulAddress & 3))) {
      AssertFailure("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AmesianX/OpenBLT/refs/heads/master/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/lib/driverlib/flashlib.c", 200);
    }
  };
  {
    if (!(!(ulCount & 3))) {
      AssertFailure("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AmesianX/OpenBLT/refs/heads/master/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/lib/driverlib/flashlib.c", 201);
    }
  };
  (*((volatile unsigned long *)(0x400FD014))) = 0x00000001;
  if ((*((volatile unsigned long *)(0x400FE1A0))) & 0x00000001) {
    while (ulCount) {
      (*((volatile unsigned long *)(0x400FD000))) = ulAddress & ~(0x7f);
      while (((ulAddress & 0x7c) || ((*((volatile unsigned long *)(0x400FD030))) == 0)) && (ulCount != 0)) {
        (*((volatile unsigned long *)(0x400FD100 + (ulAddress & 0x7c)))) = *pulData++;
        ulAddress += 4;
        ulCount -= 4;
      }
      (*((volatile unsigned long *)(0x400FD020))) = 0xA4420000 | 0x00000001;
      while ((*((volatile unsigned long *)(0x400FD020))) & 0x00000001) {
      }
    }
  } else {
    while (ulCount) {
      (*((volatile unsigned long *)(0x400FD000))) = ulAddress;
      (*((volatile unsigned long *)(0x400FD004))) = *pulData;
      (*((volatile unsigned long *)(0x400FD008))) = 0xA4420000 | 0x00000001;
      while ((*((volatile unsigned long *)(0x400FD008))) & 0x00000001) {
      }
      pulData++;
      ulAddress += 4;
      ulCount -= 4;
    }
  }
  if ((*((volatile unsigned long *)(0x400FD00C))) & 0x00000001) {
    return (-1);
  }
  return (0);
}
```