user: 下面的汇编指令对应的C源代码是什么:

```asm
<test_untemper>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,-0x54(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x54(%rbp),%eax
  mov    %eax,-0x40(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x40(%rbp),%eax
  sar    $0xb,%eax
  xor    %edx,%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x3c(%rbp),%eax
  shl    $0x7,%eax
  and    $0x9d2c5680,%eax
  xor    %edx,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x38(%rbp),%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%eax
  shl    $0xf,%eax
  and    $0xefc60000,%eax
  xor    %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%edx
  mov    -0x34(%rbp),%eax
  sar    $0x12,%eax
  xor    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x20(%rbp),%eax
  sar    $0x12,%eax
  xor    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  shl    $0xf,%eax
  and    $0xefc60000,%eax
  xor    %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  shl    $0x7,%eax
  and    $0x9d2c5680,%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%eax
  shl    $0x7,%eax
  shl    $0x7,%eax
  and    $0x94284000,%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%eax
  shl    $0x7,%eax
  shl    $0xe,%eax
  and    $0x14200000,%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%eax
  shl    $0x7,%eax
  shl    $0x15,%eax
  and    $0x10000000,%eax
  xor    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%edx
  mov    -0x14(%rbp),%eax
  sar    $0xb,%eax
  xor    %eax,%edx
  mov    -0x14(%rbp),%eax
  sar    $0x16,%eax
  xor    %edx,%eax
  mov    %eax,-0x10(%rbp)
  movq   $0x0,-0x48(%rbp)
  jmp    L9
L28:
  mov    -0x10(%rbp),%edx
  mov    -0x40(%rbp),%eax
  cmp    %eax,%edx
  je     L29
  mov    $0x4,%eax
  sub    -0x48(%rbp),%rax
  mov    -0x20(%rbp,%rax,4),%ecx
  mov    -0x48(%rbp),%rax
  mov    -0x40(%rbp,%rax,4),%edx
  mov    -0x48(%rbp),%rax
  mov    %rax,%rsi
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L29:
  addq   $0x1,-0x48(%rbp)
L9:
  cmpq   $0x4,-0x48(%rbp)
  jbe    L28
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L36
  call   <__stack_chk_fail@plt>
L36:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D7
type_guessed: string

tool: D7: Tempering steps %zu: 0x%02x - 0x%02x 


assistant: ```c
void test_untemper(const uint32_t val) {
  size_t i;
  uint32_t temp_steps[5], untemp_steps[5];
  temp_steps[0] = val;
  temp_steps[1] = temp_steps[0] ^ (temp_steps[0] >> 11);
  temp_steps[2] = temp_steps[1] ^ ((temp_steps[1] << 7) & (0x9d2c5680));
  temp_steps[3] = temp_steps[2] ^ ((temp_steps[2] << 15) & (0xefc60000));
  temp_steps[4] = temp_steps[3] ^ (temp_steps[3] >> 18);
  untemp_steps[0] = temp_steps[4];
  untemp_steps[1] = untemp_steps[0] ^ (untemp_steps[0] >> 18);
  untemp_steps[2] = (untemp_steps[1]) ^ ((untemp_steps[1] << 15) & (0xefc60000));
  untemp_steps[3] = (untemp_steps[2]) ^ ((untemp_steps[2] << 7) & (0x9d2c5680)) ^ ((((untemp_steps[2] << 7) & (0x9d2c5680)) << 7) & (0x9d2c5680)) ^ ((((((untemp_steps[2] << 7) & (0x9d2c5680)) << 7) & (0x9d2c5680)) << 7) & (0x9d2c5680)) ^ ((((((((untemp_steps[2] << 7) & (0x9d2c5680)) << 7) & (0x9d2c5680)) << 7) & (0x9d2c5680)) << 7) & (0x9d2c5680));
  untemp_steps[4] = untemp_steps[3] ^ (untemp_steps[3] >> 11) ^ (untemp_steps[3] >> 22);
  for (i = 0; i < 5; i++)
    if (untemp_steps[4] != temp_steps[0])
      printf("Tempering steps %zu: 0x%02x - 0x%02x \n", i, temp_steps[i], untemp_steps[4 - i]);
}
```