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

```asm
<ADCSequenceStepConfigure>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  shl    $0x5,%rax
  add    %rax,-0x18(%rbp)
  shlq   $0x2,-0x28(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    $0xf,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  not    %eax
  cltq
  mov    %rdx,%rsi
  and    %rax,%rsi
  mov    -0x30(%rbp),%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    -0x18(%rbp),%rax
  or     %rsi,%rdx
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    $0xf,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  not    %eax
  cltq
  mov    %rdx,%rsi
  and    %rax,%rsi
  mov    -0x30(%rbp),%rax
  shr    $0x4,%rax
  and    $0xf,%eax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rcx
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    %rax,%rdx
  mov    %rsi,%rax
  or     %rcx,%rax
  mov    %rax,(%rdx)
  mov    -0x30(%rbp),%rax
  and    $0xf0000,%eax
  test   %rax,%rax
  je     L3
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  mov    $0xf,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  not    %eax
  cltq
  and    %rax,-0x8(%rbp)
  mov    -0x30(%rbp),%rax
  shr    $0x10,%rax
  and    $0x7,%eax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  or     %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  cltq
  or     %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  jmp    L1
L3:
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  not    %eax
  cltq
  and    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
L1:
  nop
  pop    %rbp
  ret
```

assistant: ```c
void ADCSequenceStepConfigure(unsigned long ulBase, unsigned long ulSequenceNum, unsigned long ulStep, unsigned long ulConfig) {
  unsigned long ulTemp;
  ;
  ;

  ;
  ulBase += (0x00000040) + ((0x00000060 - 0x00000040) * ulSequenceNum);
  ulStep *= 4;
  (*((volatile unsigned long *)(ulBase + (0x00000040 - 0x00000040)))) = (((*((volatile unsigned long *)(ulBase + (0x00000040 - 0x00000040)))) & ~(0x0000000f << ulStep)) | ((ulConfig & 0x0f) << ulStep));
  (*((volatile unsigned long *)(ulBase + (0x00000044 - 0x00000040)))) = (((*((volatile unsigned long *)(ulBase + (0x00000044 - 0x00000040)))) & ~(0x0000000f << ulStep)) | (((ulConfig & 0xf0) >> 4) << ulStep));
  if (ulConfig & 0x000F0000) {
    ulTemp = (*((volatile unsigned long *)(ulBase + (0x00000054 - 0x00000040))));
    ulTemp &= ~(0xF << ulStep);
    ulTemp |= (((ulConfig & 0x00070000) >> 16) << ulStep);
    (*((volatile unsigned long *)(ulBase + (0x00000054 - 0x00000040)))) = ulTemp;
    ulTemp = (*((volatile unsigned long *)(ulBase + (0x00000050 - 0x00000040))));
    ulTemp |= (1 << ulStep);
    (*((volatile unsigned long *)(ulBase + (0x00000050 - 0x00000040)))) = ulTemp;
  } else {
    ulTemp = (*((volatile unsigned long *)(ulBase + (0x00000050 - 0x00000040))));
    ulTemp &= ~(1 << ulStep);
    (*((volatile unsigned long *)(ulBase + (0x00000050 - 0x00000040)))) = ulTemp;
  }
}
```