user: 请将以下的汇编代码转换成C语言代码：

```asm
<UARTConfigSetExpClk>:
  endbr64
  push   %r13
  mov    %rdx,%r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %rcx,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x8,%rsp
  call   <UARTBaseValid@plt>
  mov    %eax,%edi
  call   <DEBUG_ASSERT@plt>
  xor    %edi,%edi
  test   %r13,%r13
  setne  %dil
  call   <DEBUG_ASSERT@plt>
  mov    0x400fe000,%rdx
  mov    $0x10,%eax
  test   $0x70000000,%edx
  je     L30
  mov    0x400fe000,%rdx
  and    $0x70ff0000,%edx
  cmp    $0x10000000,%rdx
  je     L30
  mov    0x400fe000,%rdx
  and    $0x70ff0000,%edx
  cmp    $0x10010000,%rdx
  je     L73
L14:
  mov    0x400fe000,%rdx
  mov    $0x8,%eax
  and    $0x70ff0000,%edx
  cmp    $0x10030000,%rdx
  je     L26
  nopl   0x0(%rax,%rax,1)
L30:
  imul   %r13,%rax
  xor    %edi,%edi
  cmp    %rbx,%rax
  setbe  %dil
  call   <DEBUG_ASSERT@plt>
  mov    %r12,%rdi
  call   <UARTDisable@plt>
  mov    %r13,%rax
  shl    $0x4,%rax
  cmp    %rbx,%rax
  mov    0x30(%r12),%rax
  jbe    L88
  or     $0x20,%rax
  shr    %r13
  mov    %rax,0x30(%r12)
L32:
  lea    0x0(,%rbx,8),%rax
  xor    %edx,%edx
  mov    %r12,%rdi
  div    %r13
  add    $0x1,%rax
  mov    %rax,%rdx
  shr    %rax
  shr    $0x7,%rdx
  and    $0x3f,%eax
  mov    %rdx,0x24(%r12)
  mov    %rax,0x28(%r12)
  mov    %rbp,0x2c(%r12)
  movq   $0x0,0x18(%r12)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    10b0 <UARTEnable@plt>
  nop
L88:
  and    $0xffffffffffffffdf,%rax
  mov    %rax,0x30(%r12)
  jmp    L32
  nopl   0x0(%rax,%rax,1)
L26:
  mov    0x400fe000,%rax
  movzwl %ax,%eax
  cmp    $0x1,%rax
  sbb    %rax,%rax
  and    $0x8,%eax
  add    $0x8,%rax
  jmp    L30
  xchg   %ax,%ax
L73:
  mov    0x400fe000,%rdx
  cmp    $0x2,%dx
  jne    L14
  jmp    L30
```

assistant: ```c
void UARTConfigSetExpClk(unsigned long ulBase, unsigned long ulUARTClk, unsigned long ulBaud, unsigned long ulConfig) {
  unsigned long ulDiv;
  DEBUG_ASSERT(UARTBaseValid(ulBase));
  DEBUG_ASSERT(ulBaud != 0);
  DEBUG_ASSERT(ulUARTClk >= (ulBaud * ((((((*((volatile unsigned long *)(0x400FE000))) & 0x70000000) == 0x00000000) || (((*((volatile unsigned long *)(0x400FE000))) & (0x70000000 | 0x00FF0000)) == (0x10000000 | 0x00000000))) || ((((*((volatile unsigned long *)(0x400FE000))) & (0x70000000 | 0x00FF0000)) == (0x10000000 | 0x00010000)) && (((*((volatile unsigned long *)(0x400FE000))) & (0x0000FF00 | 0x000000FF)) == (0x00000000 | 0x00000002))) || ((((*((volatile unsigned long *)(0x400FE000))) & (0x70000000 | 0x00FF0000)) == (0x10000000 | 0x00030000)) && (((*((volatile unsigned long *)(0x400FE000))) & (0x0000FF00 | 0x000000FF)) == (0x00000000 | 0x00000000)))) ? 16 : 8)));
  UARTDisable(ulBase);
  if ((ulBaud * 16) > ulUARTClk) {
    (*((volatile unsigned long *)(ulBase + 0x00000030))) |= 0x00000020;
    ulBaud /= 2;
  } else {
    (*((volatile unsigned long *)(ulBase + 0x00000030))) &= ~(0x00000020);
  }
  ulDiv = (((ulUARTClk * 8) / ulBaud) + 1) / 2;
  (*((volatile unsigned long *)(ulBase + 0x00000024))) = ulDiv / 64;
  (*((volatile unsigned long *)(ulBase + 0x00000028))) = ulDiv % 64;
  (*((volatile unsigned long *)(ulBase + 0x0000002C))) = ulConfig;
  (*((volatile unsigned long *)(ulBase + 0x00000018))) = 0;
  UARTEnable(ulBase);
}
```