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

```asm
<recover_lo>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %edi,-0x44(%rbp)
  mov    %esi,-0x48(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  movl   $0x1f,-0x30(%rbp)
  jmp    L13
L17:
  mov    $0x0,%eax
  call   <arc4random@plt>
  mov    $0x20,%edx
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%ebx
  mov    $0x0,%eax
  call   <arc4random@plt>
  xor    %ebx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    $0x0,%eax
  call   <arc4random@plt>
  mov    $0x20,%edx
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%ebx
  mov    $0x0,%eax
  call   <arc4random@plt>
  xor    %ebx,%eax
  mov    %eax,-0x28(%rbp)
  mov    $0x0,%eax
  call   <arc4random@plt>
  mov    $0x20,%edx
  mov    %edx,%ecx
  shl    %cl,%eax
  xor    $0x80000000,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x30(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  mov    %eax,%esi
  mov    -0x34(%rbp),%eax
  not    %eax
  cltq
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%ecx
  shr    %cl,%rdx
  mov    -0x30(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %esi,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x30(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x44(%rbp),%edx
  mov    -0x20(%rbp),%eax
  lea    (%rdx,%rax,1),%edi
  mov    -0x28(%rbp),%ecx
  mov    -0x2c(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %eax,%esi
  call   <potr_1@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x44(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  mov    -0x28(%rbp),%ecx
  mov    -0x2c(%rbp),%edx
  mov    -0x24(%rbp),%esi
  mov    %eax,%edi
  call   <potr_1@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  mov    -0x14(%rbp),%edx
  movslq %edx,%rdx
  movabs $0x100000000,%rcx
  xor    %rcx,%rdx
  cmp    %rdx,%rax
  jne    L29
  mov    -0x30(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  or     %edx,%eax
  mov    %eax,-0x34(%rbp)
L29:
  subl   $0x1,-0x30(%rbp)
L13:
  cmpl   $0x0,-0x30(%rbp)
  jns    L17
  mov    -0x34(%rbp),%eax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
uint64_t recover_lo(uint64_t secret_key, uint64_t hi_key) {
  uint64_t kk = hi_key;
  for (int i = 31; i >= 0; i--) {
    uint64_t m1, m2, c11, c12, n;
    uint64_t delta_p, delta_m;
    m1 = (((uint64_t)arc4random()) << 32) ^ arc4random();
    m2 = (((uint64_t)arc4random()) << 32) ^ arc4random();
    n = (((uint64_t)arc4random()) << 32) ^ 0x80000000ULL;
    delta_p = (1ULL << (i)) - ((kk)&0xFFFFFFFF00000000ULL) + (((((~kk) & 0x00000000FFFFFFFFULL)) >> (i + 1)) << (i + 1));
    delta_m = (1ULL << (i)) + ((kk)&0xFFFFFFFF00000000ULL) + ((kk)&0x00000000FFFFFFFFULL);
    c11 = potr_1(secret_key + delta_p, n ^ (1ULL << (32)), m1 ^ (1ULL << (32)), m2);
    c12 = potr_1(secret_key - delta_m, n, m1 ^ ((((((1ULL << (32))) & 0x8000000000000000ULL) ? ((((1ULL << (32)))) << 1ULL) ^ 0x000000000000001BULL : (((1ULL << (32))) << 1ULL)) & 0x8000000000000000ULL) ? ((((((1ULL << (32))) & 0x8000000000000000ULL) ? ((((1ULL << (32)))) << 1ULL) ^ 0x000000000000001BULL : (((1ULL << (32))) << 1ULL))) << 1ULL) ^ 0x000000000000001BULL : (((((1ULL << (32))) & 0x8000000000000000ULL) ? ((((1ULL << (32)))) << 1ULL) ^ 0x000000000000001BULL : (((1ULL << (32))) << 1ULL)) << 1ULL)), m2);
    if (c11 == (c12 ^ (1ULL << (32))))
      kk |= (1ULL << (i));
  }
  return kk;
}
```