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

```asm
<ordenDescendente>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xfb0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xfa8(%rsp)
  xor    %eax,%eax
  test   %esi,%esi
  jle    L89
  mov    %rdi,%r13
  mov    %esi,%r12d
  mov    %edx,%ebx
  lea    D34(%rip),%rdi
  call   <printf@plt>
  cmp    $0x4,%ebx
  ja     L15
  mov    %ebx,%eax
  lea    D47(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D1(%rip),%rdi
  call   <puts@plt>
L15:
  lea    D40(%rip),%rsi
  lea    D101(%rip),%rbp
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D135(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D91(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D75(%rip),%rsi
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D9(%rip),%rsi
  lea    D116(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rsp,%rax
  lea    -0x1(%r12),%edx
  lea    0x4(%rsp,%rdx,4),%rdx
L24:
  movl   $0xffffffff,(%rax)
  add    $0x4,%rax
  cmp    %rdx,%rax
  jne    L24
  movslq %ebx,%rbx
  lea    0x0(%r13,%rbx,4),%r14
  mov    $0x0,%ebp
  mov    %rsp,%rbx
  jmp    L127
  lea    D112(%rip),%rdi
  call   <puts@plt>
  jmp    L15
  lea    D19(%rip),%rdi
  call   <puts@plt>
  jmp    L15
  lea    D96(%rip),%rdi
  call   <puts@plt>
  jmp    L15
  lea    D130(%rip),%rdi
  call   <puts@plt>
  jmp    L15
L135:
  add    $0x1,%rax
  add    $0x14,%rdx
  cmp    %rax,%r9
  je     L1
L47:
  mov    (%rdx),%ecx
  cmp    %esi,%ecx
  jle    L135
  cmpl   $0xffffffff,(%rbx,%rax,4)
  cmove  %eax,%r8d
  cmove  %ecx,%esi
  jmp    L135
L1:
  movslq %r8d,%rax
  movl   $0x1,(%rsp,%rax,4)
  mov    %r8d,%esi
  mov    %r13,%rdi
  call   <imprimirFilaDeMatriz@plt>
  add    $0x1,%ebp
  cmp    %ebp,%r12d
  je     L20
L127:
  mov    %r12d,%r9d
  mov    %r14,%rdx
  mov    $0x0,%eax
  mov    $0x0,%r8d
  mov    $0x0,%esi
  jmp    L47
L89:
  lea    D106(%rip),%rdi
  call   <puts@plt>
L20:
  mov    0xfa8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L44
  add    $0xfb0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L44:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D34
data_type: string
name: retrieve_data
arguments: label: D1
data_type: string
name: retrieve_data
arguments: label: D40
data_type: string
name: retrieve_data
arguments: label: D101
data_type: string
name: retrieve_data
arguments: label: D135
data_type: string
name: retrieve_data
arguments: label: D91
data_type: string
name: retrieve_data
arguments: label: D75
data_type: string
name: retrieve_data
arguments: label: D9
data_type: string
name: retrieve_data
arguments: label: D116
data_type: string
name: retrieve_data
arguments: label: D112
data_type: string
name: retrieve_data
arguments: label: D19
data_type: string
name: retrieve_data
arguments: label: D96
data_type: string
name: retrieve_data
arguments: label: D130
data_type: string
name: retrieve_data
arguments: label: D106
data_type: string

tool: D34: Orden Ascendente Por 

tool: D1: ID: 

tool: D40: ID

tool: D101: %15s

tool: D135: Edad

tool: D91: Pacientes

tool: D75: Horario

tool: D9: Piso

tool: D116: %15s


tool: D112: Edad:

tool: D19: Pacientes:

tool: D96: Horario:

tool: D130: Piso:

tool: D106: Matriz Vacia

assistant: ```c
void ordenDescendente(int control[1000][5], int registros, int columna) {
  if (registros > 0) {
    printf("Orden Ascendente Por ");
    switch (columna) {
    case 0:
      printf("ID: \n");
      break;
    case 1:
      printf("Edad:\n");
      break;
    case 2:
      printf("Pacientes:\n");
      break;
    case 3:
      printf("Horario:\n");
      break;
    case 4:
      printf("Piso:\n");
      break;
    }
    printf("%15s", "ID");
    printf("%15s", "Edad");
    printf("%15s", "Pacientes");
    printf("%15s", "Horario");
    printf("%15s\n", "Piso");
    int maxValor;
    int minPosicion = 0;
    int posicionesVisitadas[1000];
    for (int i = 0; i < registros; i++) {
      posicionesVisitadas[i] = -1;
    }
    for (int c = 0; c < registros; c++) {
      maxValor = 0;
      minPosicion = 0;
      for (int i = 0; i < registros; i++) {
        if (control[i][columna] > maxValor && posicionesVisitadas[i] == -1) {
          maxValor = control[i][columna];
          minPosicion = i;
        }
      }
      posicionesVisitadas[minPosicion] = 1;
      imprimirFilaDeMatriz(control, minPosicion);
    }
  } else {
    printf("Matriz Vacia\n");
  }
}
```