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

```asm
<Optition>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  mov    %edx,-0x1c(%rbp)
  mov    %ecx,-0x20(%rbp)
  mov    %r8d,-0x24(%rbp)
  mov    %r9d,-0x28(%rbp)
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D45(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L125
L83:
  mov    -0x4(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  je     L28
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D26(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D26(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x28(%rbp),%eax
  sub    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D45(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L96
L35:
  nop
  cmpb   $0x48,-0x5(%rbp)
  je     L83
  jmp    L124
L28:
  nop
L96:
  jmp    L124
L54:
  mov    -0x4(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  je     L100
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D26(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D26(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x28(%rbp),%eax
  add    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D45(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Goto@plt>
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L99
L124:
  cmpb   $0x50,-0x5(%rbp)
  je     L54
  jmp    L99
L100:
  nop
L99:
  cmpb   $0x1b,-0x5(%rbp)
  jne    L125
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  jmp    L59
L125:
  mov    $0x0,%eax
  call   <getch@plt>
  mov    %al,-0x5(%rbp)
  cmpb   $0xd,-0x5(%rbp)
  jne    L35
L59:
  mov    -0x4(%rbp),%eax
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D45
type: string
name: unpack_data
arguments: tag: D7
type: string
name: unpack_data
arguments: tag: D26
type: string

tool: D45: >>

tool: D7: <<

tool: D26:   

assistant: ```c
int Optition(int up, int down, int left, int right, int backspace, int step) {
  char ch;
  int line = up;
  Goto(left, line);
  printf(">>");
  Goto(right, line);
  printf("<<");
  while ((ch = getch()) != 0x0d) {
    while (ch == 0x48) {
      if (line == up) {
        break;
      } else {
        Goto(left, line);
        printf("  ");
        Goto(right, line);
        printf("  ");
        line -= step;
        Goto(left, line);
        printf(">>");
        Goto(right, line);
        printf("<<");
        break;
      }
    }
    while (ch == 0x50) {
      if (line == down) {
        break;
      } else {
        Goto(left, line);
        printf("  ");
        Goto(right, line);
        printf("  ");
        line += step;
        Goto(left, line);
        printf(">>");
        Goto(right, line);
        printf("<<");
        break;
      }
    }
    if (ch == 0x1b) {
      line = backspace;
      break;
    }
  }
  return line;
}
```