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

```asm
<drawMaze>:
  endbr64
  push   %r13
  push   %r12
  mov    $0x1b,%r12d
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  mov    $0x7,%ebx
  sub    $0x78,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  call   <OledClearBuffer@plt>
  mov    D25(%rip),%rax
  xor    %esi,%esi
  xor    %edi,%edi
  movdqa D34(%rip),%xmm0
  mov    %rax,0x54(%rsp)
  movups %xmm0,0x4(%rsp)
  movdqa D13(%rip),%xmm0
  movups %xmm0,0x14(%rsp)
  movdqa D5(%rip),%xmm0
  movups %xmm0,0x24(%rsp)
  movdqa D8(%rip),%xmm0
  movups %xmm0,0x34(%rsp)
  movdqa D52(%rip),%xmm0
  movups %xmm0,0x44(%rsp)
  call   <OledMoveTo@plt>
  mov    $0x1f,%esi
  mov    $0x7f,%edi
  call   <OledDrawRect@plt>
  mov    $0x7,%esi
  xor    %edi,%edi
  call   <OledMoveTo@plt>
  jmp    L40
  nopl   0x0(%rax,%rax,1)
L2:
  add    $0x8,%ebx
  xor    %edi,%edi
  mov    %ebx,%esi
  call   <OledMoveTo@plt>
  cmp    $0x1e,%ebx
  jg     L24
  mov    %r13d,%ebp
L35:
  movslq %ebp,%rax
  mov    (%rsp,%rax,4),%r12d
L40:
  mov    %ebx,%esi
  mov    %r12d,%edi
  lea    0x1(%rbp),%r13d
  call   <OledLineTo@plt>
  cmp    $0x7f,%r12d
  je     L2
  movslq %r13d,%r13
  mov    %ebx,%esi
  add    $0x2,%ebp
  mov    (%rsp,%r13,4),%edi
  call   <OledMoveTo@plt>
  jmp    L35
  nopw   0x0(%rax,%rax,1)
L24:
  xor    %esi,%esi
  mov    $0x40,%edi
  call   <OledMoveTo@plt>
  mov    $0x17,%esi
  mov    $0x40,%edi
  call   <OledLineTo@plt>
  mov    $0x7,%esi
  mov    $0x28,%edi
  call   <OledMoveTo@plt>
  mov    $0xf,%esi
  mov    $0x28,%edi
  call   <OledLineTo@plt>
  mov    $0x7,%esi
  mov    $0x55,%edi
  call   <OledMoveTo@plt>
  mov    $0x17,%esi
  mov    $0x55,%edi
  call   <OledLineTo@plt>
  mov    $0x17,%esi
  mov    $0x60,%edi
  call   <OledMoveTo@plt>
  mov    $0x1f,%esi
  mov    $0x60,%edi
  call   <OledLineTo@plt>
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L5
  add    $0x78,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    10e0 <OledUpdate@plt>
L5:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D25
data_type: byte[8]
name: retrieve_data
arguments: label: D34
data_type: byte[16]
name: retrieve_data
arguments: label: D13
data_type: byte[16]
name: retrieve_data
arguments: label: D5
data_type: byte[16]
name: retrieve_data
arguments: label: D8
data_type: byte[16]
name: retrieve_data
arguments: label: D52
data_type: byte[16]

tool: {"D25": [0x6d,0x00,0x00,0x00,0x7f,0x00,0x00,0x00]}

tool: {"D34": [0x1e,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x46,0x00,0x00,0x00]}

tool: {"D13": [0x49,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x7f,0x00,0x00,0x00]}

tool: {"D5": [0x32,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x52,0x00,0x00,0x00]}

tool: {"D8": [0x5a,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x14,0x00,0x00,0x00]}

tool: {"D52": [0x17,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x6a,0x00,0x00,0x00]}

assistant: ```c
void drawMaze() {
  OledClearBuffer();
  const int grid[] = {27, 30, 44, 47, 70, 73, 107, 110, 127, 50, 53, 79, 82, 90, 93, 127, 20, 23, 67, 70, 106, 109, 127};
  OledMoveTo(0, 0);
  OledDrawRect(127, 31);
  int xc = 0;
  int yc = 7;
  int ind = 0;
  OledMoveTo(xc, yc);
  while (1) {
    OledLineTo(grid[ind], yc);
    if (grid[ind++] == 127) {
      yc += 8;
      OledMoveTo(0, yc);
      if (yc > 30)
        break;
    } else
      OledMoveTo(grid[ind++], yc);
  }
  OledMoveTo(64, 0);
  OledLineTo(64, 23);
  OledMoveTo(40, 7);
  OledLineTo(40, 15);
  OledMoveTo(85, 7);
  OledLineTo(85, 23);
  OledMoveTo(96, 23);
  OledLineTo(96, 31);
  OledUpdate();
}
```