user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    $0x91000000,%eax
  mov    %rax,-0x10(%rbp)
  mov    $0xdeadbeef,%eax
  mov    %rax,-0x8(%rbp)
  mov    $0x80000000,%eax
  mov    %rax,-0x18(%rbp)
  lea    D38(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x10(%rbp),%rax
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0xff,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fillScreen@plt>
  mov    $0x1e8480,%edi
  mov    $0x0,%eax
  call   <usleep@plt>
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x8(%rbp),%rax
  mov    $0x0,%ecx
  mov    $0xff,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fillScreen@plt>
  mov    $0x1e8480,%edi
  mov    $0x0,%eax
  call   <usleep@plt>
  mov    $0xdeadbeef,%esi
  lea    D28(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x18(%rbp),%rax
  movl   $0xdeadbeef,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1e8480,%edi
  mov    $0x0,%eax
  call   <usleep@plt>
  lea    D31(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x10(%rbp),%rax
  mov    $0xff,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fillScreen@plt>
  mov    $0x1e8480,%edi
  mov    $0x0,%eax
  call   <usleep@plt>
  lea    D77(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L1:
  jmp    L1
```

tool_calls: name: retrieve_data
arguments: tag: D38
type_guessed: string
name: retrieve_data
arguments: tag: D34
type_guessed: string
name: retrieve_data
arguments: tag: D44
type_guessed: string
name: retrieve_data
arguments: tag: D66
type_guessed: string
name: retrieve_data
arguments: tag: D28
type_guessed: string
name: retrieve_data
arguments: tag: D31
type_guessed: string
name: retrieve_data
arguments: tag: D77
type_guessed: string

tool: D38: Startup.

tool: D34: Reading from AR: 0x%08x


tool: D44: Filling the screen red at current vmem address.

tool: D66: Filling the screen green at new vmem address.

tool: D28: Writing to AR (this should remap the bus to 0x%08x)


tool: D31: Filling the screen blue at old vmem address. NOTHING SHOULD HAPPEN!

tool: D77: Test done, looping.

assistant: ```c
int main() {
  unsigned char *firstVmem = (unsigned char *)0x91000000;
  unsigned char *secondVmem = (unsigned char *)0xDEADBEEF;
  unsigned int *volatile ar = (unsigned int *)0x80000000U;
  printf("Startup.\n");
  printf("Reading from AR: 0x%08x\n", *ar);
  printf("Filling the screen red at current vmem address.\n");
  fillScreen(firstVmem, 0xff, 0, 0);
  usleep(2 * 1000000);
  printf("Filling the screen green at new vmem address.\n");
  fillScreen(secondVmem, 0, 0xff, 0);
  usleep(2 * 1000000);
  printf("Writing to AR (this should remap the bus to 0x%08x)\n", 0xDEADBEEF);
  *ar = 0xDEADBEEF;
  printf("Reading from AR: 0x%08x\n", *ar);
  usleep(2 * 1000000);
  printf("Filling the screen blue at old vmem address. NOTHING SHOULD HAPPEN!\n");
  fillScreen(firstVmem, 0, 0, 0xff);
  usleep(2 * 1000000);
  printf("Test done, looping.\n");
  while (1)
    ;
  return 0;
}
```