user: 请从给定的汇编指令推导出C源代码:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x398,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x388(%rsp)
  xor    %eax,%eax
  mov    %rsp,%rdi
  lea    D7(%rip),%rsi
  mov    $0x70,%ecx
  rep movsq %ds:(%rsi),%es:(%rdi)
  mov    (%rsi),%eax
  mov    %eax,(%rdi)
  movl   $0xa9,0x80(%rsp)
  mov    $0x0,%edi
  call   <time@plt>
  mov    %eax,%edi
  call   <srand@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x1e,%edx
  lea    (%rax,%rdx,1),%ebx
  and    $0x3,%ebx
  sub    %edx,%ebx
  add    $0x1,%ebx
  mov    %rsp,%rdi
  mov    %ebx,%esi
  call   <imprimir@plt>
  mov    $0x0,%ebp
  mov    $0x2,%r13d
  mov    $0x2,%r12d
  mov    $0x1,%r15d
  mov    %rsp,%r14
  jmp    L35
L113:
  mov    $0x0,%eax
  call   <getch@plt>
  cmp    $0x72,%al
  je     L122
  cmp    $0x70,%al
  jne    L7
  mov    $0x0,%r15d
  jmp    L112
L73:
  lea    0x1(%r13),%edx
  movslq %edx,%rsi
  mov    %rcx,%rax
  shl    $0x4,%rax
  sub    %rcx,%rax
  add    %rsi,%rax
  cmpl   $0xff,(%rsp,%rax,4)
  cmove  %edx,%r13d
L129:
  cmp    $0x4,%ebx
  jne    L98
  lea    -0x1(%r12),%ecx
  movslq %r13d,%rdx
  movslq %ecx,%rsi
  mov    %rsi,%rax
  shl    $0x4,%rax
  sub    %rsi,%rax
  add    %rdx,%rax
  cmpl   $0xff,(%rsp,%rax,4)
  cmove  %ecx,%r12d
  jmp    L98
L118:
  cmp    $0x3,%ebx
  jne    L129
  lea    0x1(%r12),%ecx
  movslq %r13d,%rdx
  movslq %ecx,%rsi
  mov    %rsi,%rax
  shl    $0x4,%rax
  sub    %rsi,%rax
  add    %rdx,%rax
  cmpl   $0xff,(%rsp,%rax,4)
  cmove  %ecx,%r12d
L98:
  movslq %r13d,%rdx
  movslq %r12d,%rcx
  mov    %rcx,%rax
  shl    $0x4,%rax
  sub    %rcx,%rax
  add    %rdx,%rax
  movl   $0xa9,(%rsp,%rax,4)
  mov    %ebx,%esi
  mov    %r14,%rdi
  call   <imprimir@plt>
  add    $0x1,%ebp
  movslq %ebp,%rax
  imul   $0x66666667,%rax,%rax
  sar    $0x22,%rax
  mov    %ebp,%edx
  sar    $0x1f,%edx
  sub    %edx,%eax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  cmp    %eax,%ebp
  je     L81
L138:
  mov    $0x1,%r15d
L112:
  mov    $0x64,%edi
  call   <Sleep@plt>
L35:
  mov    $0x0,%eax
  call   <kbhit@plt>
  test   %rax,%rax
  jne    L113
L7:
  test   %r15d,%r15d
  je     L112
L122:
  movslq %r13d,%rdx
  movslq %r12d,%rcx
  mov    %rcx,%rax
  shl    $0x4,%rax
  sub    %rcx,%rax
  add    %rdx,%rax
  movl   $0xff,(%rsp,%rax,4)
  cmp    $0x1,%ebx
  je     L73
  cmp    $0x2,%ebx
  jne    L118
  lea    -0x1(%r13),%edx
  movslq %edx,%rsi
  movslq %r12d,%rcx
  mov    %rcx,%rax
  shl    $0x4,%rax
  sub    %rcx,%rax
  add    %rsi,%rax
  cmpl   $0xff,(%rsp,%rax,4)
  cmove  %edx,%r13d
  jmp    L98
L81:
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x1e,%edx
  lea    (%rax,%rdx,1),%ebx
  and    $0x3,%ebx
  sub    %edx,%ebx
  add    $0x1,%ebx
  jmp    L138
```

tool_calls: name: retrieve_data
arguments: data_tag: D7
type_guessed: string

tool: D7: #

assistant: ```c
int main(int argc, char *argv[]) {
  int mapa[15][15] = {{35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}};
  char tecla;
  int band, dir, fp, cp, tiempo;
  fp = 2;
  cp = 2;
  mapa[fp][cp] = 169;
  band = 1;
  srand(time(0));
  dir = rand() % 4 + 1;
  imprimir(mapa, dir);
  tiempo = 0;
  while (1) {
    tecla = 0;
    if (kbhit())
      tecla = getch();
    if (tecla == 'r')
      band = 1;
    if (tecla == 'p')
      band = 0;
    if (band) {
      mapa[fp][cp] = 255;
      if (dir == 1) {
        if (mapa[fp][cp + 1] == 255) {
          cp++;
        }
      }
      if (dir == 2) {
        if (mapa[fp][cp - 1] == 255) {
          cp--;
        }
      }
      if (dir == 3) {
        if (mapa[fp + 1][cp] == 255) {
          fp++;
        }
      }
      if (dir == 4) {
        if (mapa[fp - 1][cp] == 255) {
          fp--;
        }
      }
      mapa[fp][cp] = 169;
      imprimir(mapa, dir);
      tiempo++;
      if (tiempo % 10 == 0) {
        dir = rand() % 4 + 1;
      }
    }
    if (tecla == 'p')
      band = 0;
    if (tecla == 'r')
      band = 1;
    Sleep(100);
  }
  return 0;
}
```