user: What is the c source code of the assembly code below?

```asm
<test_tlb_mmio>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x18,%rsp
  movl   $0x0,-0x14(%rbp)
  jmp    L29
L32:
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x9000000,%eax
  mov    %eax,%eax
  movq   $0x0,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xa000000,%eax
  mov    %eax,%eax
  mov    $0xffffffff,%ebx
  mov    %rbx,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xa000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  mov    $0xffffffff,%edx
  cmp    %rdx,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x9000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  cmp    $0x104,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xa000000,%eax
  mov    %eax,%eax
  movq   $0x0,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xa000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x9000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x9000000,%eax
  mov    %eax,%eax
  mov    %rbx,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x9000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  cmp    $0x1ffffdff,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xa000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  cmp    $0x300,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x9000000,%eax
  mov    %eax,%eax
  movq   $0x0,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x9000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xa000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x8800000,%eax
  mov    %eax,%eax
  mov    %rbx,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x8800000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  cmp    $0xf,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x8800000,%eax
  mov    %eax,%eax
  movq   $0x0,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0x8800000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  addl   $0x1,-0x14(%rbp)
L29:
  cmpl   $0x3f,-0x14(%rbp)
  jle    L32
  movl   $0x0,-0x14(%rbp)
  jmp    L33
L20:
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xd000000,%eax
  mov    %eax,%eax
  movq   $0x0,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xe000000,%eax
  mov    %eax,%eax
  mov    $0xffffffff,%ebx
  mov    %rbx,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xe000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  mov    $0xfffffdff,%edx
  cmp    %rdx,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xd000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  cmp    $0x100,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xe000000,%eax
  mov    %eax,%eax
  movq   $0x0,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xe000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xd000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xd000000,%eax
  mov    %eax,%eax
  mov    %rbx,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xd000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  cmp    $0x1ffffdda,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xe000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  cmp    $0x100,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xd000000,%eax
  mov    %eax,%eax
  movq   $0x0,(%rax)
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xd000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x14(%rbp),%eax
  shl    $0x8,%eax
  sub    $0xe000000,%eax
  mov    %eax,%eax
  mov    (%rax),%rax
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  addl   $0x1,-0x14(%rbp)
L33:
  cmpl   $0x3,-0x14(%rbp)
  jle    L20
  nop
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void test_tlb_mmio() {
  int entry;
  for (entry = 0; entry < 64; entry++) {
    ((*((volatile unsigned long *)((0xF7000000 + (entry << 8))))) = (0));
    ((*((volatile unsigned long *)((0xF6000000 + (entry << 8))))) = (0xFFFFFFFF));
    assert((*((volatile unsigned long *)((0xF6000000 + (entry << 8))))) == 0xFFFFFFFF);
    assert((*((volatile unsigned long *)((0xF7000000 + (entry << 8))))) == 0x00000104);
    ((*((volatile unsigned long *)((0xF6000000 + (entry << 8))))) = (0x00000000));
    assert((*((volatile unsigned long *)((0xF6000000 + (entry << 8))))) == 0x00000000);
    assert((*((volatile unsigned long *)((0xF7000000 + (entry << 8))))) == 0x00000000);
    ((*((volatile unsigned long *)((0xF7000000 + (entry << 8))))) = (0xFFFFFFFF));
    assert((*((volatile unsigned long *)((0xF7000000 + (entry << 8))))) == 0x1FFFFDFF);
    assert((*((volatile unsigned long *)((0xF6000000 + (entry << 8))))) == 0x00000300);
    ((*((volatile unsigned long *)((0xF7000000 + (entry << 8))))) = (0x00000000));
    assert((*((volatile unsigned long *)((0xF7000000 + (entry << 8))))) == 0x00000000);
    assert((*((volatile unsigned long *)((0xF6000000 + (entry << 8))))) == 0x00000000);
    ((*((volatile unsigned long *)((0xF7800000 + (entry << 8))))) = (0xFFFFFFFF));
    assert((*((volatile unsigned long *)((0xF7800000 + (entry << 8))))) == 0x0000000F);
    ((*((volatile unsigned long *)((0xF7800000 + (entry << 8))))) = (0x00000000));
    assert((*((volatile unsigned long *)((0xF7800000 + (entry << 8))))) == 0x00000000);
  }
  for (entry = 0; entry < 4; entry++) {
    ((*((volatile unsigned long *)((0xF3000000 + (entry << 8))))) = (0));
    ((*((volatile unsigned long *)((0xF2000000 + (entry << 8))))) = (0xFFFFFFFF));
    assert((*((volatile unsigned long *)((0xF2000000 + (entry << 8))))) == 0xFFFFFDFF);
    assert((*((volatile unsigned long *)((0xF3000000 + (entry << 8))))) == 0x00000100);
    ((*((volatile unsigned long *)((0xF2000000 + (entry << 8))))) = (0x00000000));
    assert((*((volatile unsigned long *)((0xF2000000 + (entry << 8))))) == 0x00000000);
    assert((*((volatile unsigned long *)((0xF3000000 + (entry << 8))))) == 0x00000000);
    ((*((volatile unsigned long *)((0xF3000000 + (entry << 8))))) = (0xFFFFFFFF));
    assert((*((volatile unsigned long *)((0xF3000000 + (entry << 8))))) == 0x1FFFFDDA);
    assert((*((volatile unsigned long *)((0xF2000000 + (entry << 8))))) == 0x00000100);
    ((*((volatile unsigned long *)((0xF3000000 + (entry << 8))))) = (0x00000000));
    assert((*((volatile unsigned long *)((0xF3000000 + (entry << 8))))) == 0x00000000);
    assert((*((volatile unsigned long *)((0xF2000000 + (entry << 8))))) == 0x00000000);
  }
}
```