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

```asm
<print_mouse_stats>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x2,-0x20(%rbp)
  movl   $0xf,-0x1c(%rbp)
  movl   $0x16,-0x18(%rbp)
  movl   $0x1e,-0x14(%rbp)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  lea    0x2(%rax),%esi
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    -0x44(%rbp),%edx
  mov    %edx,%ecx
  lea    D27(%rip),%rdx
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  add    $0x2,%eax
  lea    D7(%rip),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x1c(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  add    $0x2,%eax
  lea    D68(%rip),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  add    $0x2,%eax
  lea    D3(%rip),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x14(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  add    $0x2,%eax
  lea    D15(%rip),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  movl   $0x1,-0x24(%rbp)
  jmp    L6
L29:
  mov    -0x24(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <commaprint@plt>
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%ecx
  mov    -0x20(%rbp),%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%ecx
  mov    -0x24(%rbp),%eax
  add    $0x3,%eax
  add    %ecx,%eax
  mov    %edx,%ecx
  lea    D69(%rip),%rdx
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  mov    -0x24(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    0x4(%rax),%eax
  mov    %eax,%edi
  call   <commaprint@plt>
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%ecx
  mov    -0x1c(%rbp),%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%ecx
  mov    -0x24(%rbp),%eax
  add    $0x3,%eax
  add    %ecx,%eax
  mov    %edx,%ecx
  lea    D69(%rip),%rdx
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  mov    -0x24(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%eax
  mov    %eax,%edi
  call   <commaprint@plt>
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%ecx
  mov    -0x24(%rbp),%eax
  add    $0x3,%eax
  add    %ecx,%eax
  mov    %edx,%ecx
  lea    D69(%rip),%rdx
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  mov    -0x24(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    0xc(%rax),%eax
  mov    %eax,%edi
  call   <commaprint@plt>
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%ecx
  mov    -0x14(%rbp),%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%ecx
  mov    -0x24(%rbp),%eax
  add    $0x3,%eax
  add    %ecx,%eax
  mov    %edx,%ecx
  lea    D69(%rip),%rdx
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <mvprintw@plt>
  addl   $0x1,-0x24(%rbp)
L6:
  mov    -0x24(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jle    L29
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L3
  call   <__stack_chk_fail@plt>
L3:
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D27
type: string
name: parse_data
arguments: label: D7
type: string
name: parse_data
arguments: label: D68
type: string
name: parse_data
arguments: label: D3
type: string
name: parse_data
arguments: label: D15
type: string
name: parse_data
arguments: label: D69
type: string

tool: D27:  Stats - Last %d days 

tool: D7: Movement

tool: D68: Left

tool: D3: Center

tool: D15: Right

tool: D69: %s

assistant: ```c
void print_mouse_stats(int cords[], int stats_data[][4], int days) {
  int column[4] = {2, 15, 22, 30};
  mvprintw(cords[1], cords[0] + 2, " Stats - Last %d days ", days);
  mvprintw(cords[1] + 2, cords[0] + column[0], "Movement");
  mvprintw(cords[1] + 2, cords[0] + column[1], "Left");
  mvprintw(cords[1] + 2, cords[0] + column[2], "Center");
  mvprintw(cords[1] + 2, cords[0] + column[3], "Right");
  for (int i = 1; i <= days; i++) {
    mvprintw(cords[1] + (3 + i), cords[0] + column[0], "%s", commaprint(stats_data[i][0]));
    mvprintw(cords[1] + (3 + i), cords[0] + column[1], "%s", commaprint(stats_data[i][1]));
    mvprintw(cords[1] + (3 + i), cords[0] + column[2], "%s", commaprint(stats_data[i][2]));
    mvprintw(cords[1] + (3 + i), cords[0] + column[3], "%s", commaprint(stats_data[i][3]));
  }
}
```