user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<change_path>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x1,-0x5c(%rbp)
  movl   $0x0,-0x58(%rbp)
  mov    -0x70(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x70(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x54(%rbp)
  mov    -0x70(%rbp),%rax
  add    $0x8,%rax
  movl   $0x3,(%rax)
  jmp    L154
L58:
  mov    -0x70(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  cmp    $0x4,%eax
  je     L112
  cmp    $0x4,%eax
  jg     L121
  cmp    $0x3,%eax
  je     L80
  cmp    $0x3,%eax
  jg     L121
  cmp    $0x1,%eax
  je     L52
  cmp    $0x2,%eax
  je     L165
  jmp    L121
L52:
  addl   $0x1,-0x50(%rbp)
  addl   $0x1,-0x5c(%rbp)
  jmp    L121
L165:
  addl   $0x1,-0x54(%rbp)
  addl   $0x1,-0x5c(%rbp)
  jmp    L121
L80:
  subl   $0x1,-0x50(%rbp)
  addl   $0x1,-0x5c(%rbp)
  jmp    L121
L112:
  subl   $0x1,-0x54(%rbp)
  addl   $0x1,-0x5c(%rbp)
  nop
L121:
  mov    -0x54(%rbp),%edx
  mov    -0x50(%rbp),%ecx
  mov    -0x68(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <validate_position@plt>
  test   %rax,%rax
  je     L161
  mov    -0x58(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rbp,%rax
  lea    -0x40(%rax),%rdx
  mov    -0x50(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x58(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rbp,%rax
  lea    -0x3c(%rax),%rdx
  mov    -0x54(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x70(%rbp),%rax
  mov    0x8(%rax),%edx
  mov    -0x58(%rbp),%eax
  movslq %eax,%rcx
  mov    %rcx,%rax
  add    %rax,%rax
  add    %rcx,%rax
  shl    $0x2,%rax
  add    %rbp,%rax
  sub    $0x38,%rax
  mov    %edx,(%rax)
  addl   $0x1,-0x58(%rbp)
L161:
  mov    -0x70(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x54(%rbp)
  mov    -0x70(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x70(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%edx
  mov    -0x70(%rbp),%rax
  add    $0x8,%rax
  add    $0x1,%edx
  mov    %edx,(%rax)
  mov    -0x70(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  cmp    $0x4,%eax
  jle    L154
  mov    -0x70(%rbp),%rax
  add    $0x8,%rax
  movl   $0x1,(%rax)
L154:
  cmpl   $0x4,-0x5c(%rbp)
  jle    L58
  movl   $0x0,-0x4c(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x78(%rbp),%rax
  mov    (%rax),%ecx
  lea    -0x40(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <score@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x48(%rbp)
  movl   $0x1,-0x5c(%rbp)
  jmp    L62
L6:
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x78(%rbp),%rax
  mov    (%rax),%ecx
  lea    -0x40(%rbp),%rdi
  mov    -0x5c(%rbp),%eax
  movslq %eax,%rsi
  mov    %rsi,%rax
  add    %rax,%rax
  add    %rsi,%rax
  shl    $0x2,%rax
  add    %rdi,%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <score@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x44(%rbp)
  movss  -0x48(%rbp),%xmm0
  comiss -0x44(%rbp),%xmm0
  jbe    L81
  movss  -0x44(%rbp),%xmm0
  movss  %xmm0,-0x48(%rbp)
  mov    -0x5c(%rbp),%eax
  mov    %eax,-0x4c(%rbp)
L81:
  addl   $0x1,-0x5c(%rbp)
L62:
  mov    -0x5c(%rbp),%eax
  cmp    -0x58(%rbp),%eax
  jl     L6
  mov    -0x4c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rbp,%rax
  sub    $0x40,%rax
  mov    (%rax),%edx
  mov    -0x70(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x70(%rbp),%rax
  lea    0x4(%rax),%rcx
  mov    -0x4c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rbp,%rax
  sub    $0x3c,%rax
  mov    (%rax),%eax
  mov    %eax,(%rcx)
  mov    -0x70(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    -0x4c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rbp,%rax
  sub    $0x38,%rax
  mov    (%rax),%eax
  mov    %eax,(%rcx)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L160
  call   <__stack_chk_fail@plt>
L160:
  leave
  ret
```

assistant: ```c
void change_path(char maze[23][30], int ghost[3], int target[2]) {
  int changes[4][3];
  int i = 1, j = 0, x, y, menor_indice;
  float menor_score, score_aux;
  y = ghost[0];
  x = ghost[1];
  ghost[2] = 3;
  while (i <= 4) {
    switch (ghost[2]) {
    case 1:
      y = y + 1;
      i++;
      break;
    case 2:
      x = x + 1;
      i++;
      break;
    case 3:
      y = y - 1;
      i++;
      break;
    case 4:
      x = x - 1;
      i++;
      break;
    }
    if (validate_position(maze, y, x)) {
      changes[j][0] = y;
      changes[j][1] = x;
      changes[j][2] = ghost[2];
      j++;
    }
    x = ghost[1];
    y = ghost[0];
    ghost[2] = ghost[2] + 1;
    if (ghost[2] > 4) {
      ghost[2] = 1;
    }
  }
  menor_indice = 0;
  menor_score = score(changes[0], target[0], target[1]);
  for (i = 1; i < j; i++) {
    score_aux = score(changes[i], target[0], target[1]);
    if (score_aux < menor_score) {
      menor_score = score_aux;
      menor_indice = i;
    }
  }
  ghost[0] = changes[menor_indice][0];
  ghost[1] = changes[menor_indice][1];
  ghost[2] = changes[menor_indice][2];
}
```