user: 这段汇编代码用C语言表示是什么样的?

```asm
<pushDown>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %edx,-0x28(%rbp)
  movl   $0x0,-0x18(%rbp)
  movl   $0x0,-0x14(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  mov    -0x28(%rbp),%edx
  movslq %edx,%rdx
  cmp    %rdx,%rax
  ja     L45
  movl   $0x1,-0x18(%rbp)
L45:
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_dir@plt>
  mov    -0x28(%rbp),%edx
  movslq %edx,%rdx
  cmp    %rdx,%rax
  ja     L33
  movl   $0x1,-0x14(%rbp)
L33:
  cmpl   $0x0,-0x18(%rbp)
  je     L117
  cmpl   $0x0,-0x14(%rbp)
  jne    L117
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ebx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,%ebx
  jge    L36
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rbx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rbx,%rsi
  mov    %rax,%rdi
  call   <troca@plt>
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  mov    %eax,%ecx
  mov    -0x28(%rbp),%edx
  mov    -0x30(%rbp),%rax
  mov    %rax,%rsi
  mov    %ecx,%edi
  call   <pushDown>
  jmp    L36
L117:
  cmpl   $0x0,-0x18(%rbp)
  je     L36
  cmpl   $0x0,-0x14(%rbp)
  je     L36
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ebx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,%ebx
  jl     L112
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ebx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_dir@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,%ebx
  jge    L36
L112:
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ebx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_dir@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,%ebx
  jle    L93
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rbx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rbx,%rsi
  mov    %rax,%rdi
  call   <troca@plt>
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_esq@plt>
  mov    %eax,-0x24(%rbp)
  jmp    L65
L93:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rbx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_dir@plt>
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rbx,%rsi
  mov    %rax,%rdi
  call   <troca@plt>
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <filho_dir@plt>
  mov    %eax,-0x24(%rbp)
L65:
  mov    -0x28(%rbp),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0x24(%rbp),%eax
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <pushDown>
  jmp    L36
L36:
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void pushDown(int i, int *heap, int tam) {
  int ha_esq = 0, ha_dir = 0;
  if (filho_esq(i) <= tam)
    ha_esq = 1;
  if (filho_dir(i) <= tam)
    ha_dir = 1;
  if (ha_esq && !ha_dir) {
    if (heap[i] < heap[filho_esq(i)]) {
      troca(&heap[filho_esq(i)], &heap[i]);
      pushDown(filho_esq(i), heap, tam);
    }
  } else if (ha_esq && ha_dir) {
    if ((heap[i] < heap[filho_esq(i)]) || (heap[i] < heap[filho_dir(i)])) {
      if (heap[filho_esq(i)] > heap[filho_dir(i)]) {
        troca(&heap[filho_esq(i)], &heap[i]);
        i = filho_esq(i);
      } else {
        troca(&heap[filho_dir(i)], &heap[i]);
        i = filho_dir(i);
      }
      pushDown(i, heap, tam);
    }
  }
}
```