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

```asm
<SSIConfigSetExpClk>:
  endbr64
  push   %r15
  mov    %r8d,%r15d
  push   %r14
  mov    %ecx,%r14d
  push   %r13
  mov    %esi,%r13d
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  movslq %edi,%rbp
  push   %rbx
  mov    %ebp,%edi
  mov    %r9d,%ebx
  sub    $0x18,%rsp
  call   <_SSIBaseValid@plt>
  mov    %eax,%edi
  call   <ASSERT@plt>
  mov    $0x1,%edi
  test   $0xfffffffd,%r12d
  je     L48
  cmp    $0x20,%r12d
  ja     L12
  movabs $0x10001000a,%rdi
  mov    %r12d,%ecx
  shr    %cl,%rdi
  and    $0x1,%edi
L48:
  call   <ASSERT@plt>
  xor    %edi,%edi
  cmp    $0x1,%r14d
  setbe  %dil
  call   <ASSERT@plt>
  lea    -0x4(%rbx),%eax
  xor    %r8d,%r8d
  cmp    $0xc,%eax
  setbe  %r8b
  test   %r14d,%r14d
  je     L66
  movslq %r13d,%rax
  mov    %r13d,%edx
  imul   $0x2aaaaaab,%rax,%rax
  sar    $0x1f,%edx
  sar    $0x21,%rax
  sub    %edx,%eax
  cmp    %r15d,%eax
  jge    L17
L65:
  xor    %edi,%edi
  mov    %r8d,0xc(%rsp)
  call   <ASSERT@plt>
  mov    %r13d,%eax
  xor    %edi,%edi
  cltd
  idiv   %r15d
  cmp    $0xfe00,%eax
  mov    %eax,%r13d
  setle  %dil
  call   <ASSERT@plt>
  mov    0xc(%rsp),%edi
  call   <ASSERT@plt>
  test   %r14d,%r14d
  setne  %r14b
  movzbl %r14b,%r14d
  shl    $0x2,%r14d
L62:
  lea    0x4(%rbp),%eax
  xor    %esi,%esi
  cltq
  mov    %r14d,(%rax)
  xchg   %ax,%ax
L3:
  mov    %r13d,%eax
  add    $0x2,%esi
  cltd
  idiv   %esi
  lea    -0x1(%rax),%edx
  cmp    $0xff,%edx
  jg     L3
  lea    0x10(%rbp),%eax
  sub    $0x1,%ebx
  shl    $0x8,%edx
  cltq
  mov    %esi,(%rax)
  mov    %r12d,%eax
  shl    $0x6,%r12d
  and    $0x30,%eax
  movzbl %r12b,%r12d
  or     %eax,%ebx
  or     %r12d,%ebx
  or     %edx,%ebx
  mov    %ebx,0x0(%rbp)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L66:
  mov    %r13d,%eax
  shr    $0x1f,%eax
  add    %r13d,%eax
  sar    %eax
  cmp    %r15d,%eax
  jl     L65
  mov    $0x1,%edi
  mov    %r8d,0xc(%rsp)
  call   <ASSERT@plt>
  mov    %r13d,%eax
  xor    %edi,%edi
  cltd
  idiv   %r15d
  cmp    $0xfe00,%eax
  mov    %eax,%r13d
  setle  %dil
  call   <ASSERT@plt>
  mov    0xc(%rsp),%edi
  call   <ASSERT@plt>
  jmp    L62
  nopl   0x0(%rax,%rax,1)
L17:
  mov    $0x1,%edi
  mov    %r8d,0xc(%rsp)
  mov    $0x4,%r14d
  call   <ASSERT@plt>
  mov    %r13d,%eax
  xor    %edi,%edi
  cltd
  idiv   %r15d
  cmp    $0xfe00,%eax
  mov    %eax,%r13d
  setle  %dil
  call   <ASSERT@plt>
  mov    0xc(%rsp),%edi
  call   <ASSERT@plt>
  jmp    L62
  nopl   (%rax)
L12:
  xor    %edi,%edi
  jmp    L48
```

assistant: ```c
void SSIConfigSetExpClk(uint32_t ui32Base, uint32_t ui32SSIClk, uint32_t ui32Protocol, uint32_t ui32Mode, uint32_t ui32BitRate, uint32_t ui32DataWidth) {
  uint32_t ui32MaxBitRate;
  uint32_t ui32RegVal;
  uint32_t ui32PreDiv;
  uint32_t ui32SCR;
  uint32_t ui32SPH_SPO;
  ASSERT(_SSIBaseValid(ui32Base));
  ASSERT((ui32Protocol == 0x00000000) || (ui32Protocol == 0x00000002) || (ui32Protocol == 0x00000001) || (ui32Protocol == 0x00000003) || (ui32Protocol == 0x00000010) || (ui32Protocol == 0x00000020));
  ASSERT((ui32Mode == 0x00000000) || (ui32Mode == 0x00000001));
  ASSERT(((ui32Mode == 0x00000000) && (ui32BitRate <= (ui32SSIClk / 2))) || ((ui32Mode != 0x00000000) && (ui32BitRate <= (ui32SSIClk / 12))));
  ASSERT((ui32SSIClk / ui32BitRate) <= (254 * 256));
  ASSERT((ui32DataWidth >= 4) && (ui32DataWidth <= 16));
  ui32RegVal = (ui32Mode == 0x00000000) ? 0 : 0x00000004;
  (*((volatile uint32_t *)(ui32Base + 0x00000004))) = ui32RegVal;
  ui32MaxBitRate = ui32SSIClk / ui32BitRate;
  ui32PreDiv = 0;
  do {
    ui32PreDiv += 2;
    ui32SCR = (ui32MaxBitRate / ui32PreDiv) - 1;
  } while (ui32SCR > 255);
  (*((volatile uint32_t *)(ui32Base + 0x00000010))) = ui32PreDiv;
  ui32SPH_SPO = (ui32Protocol & 3) << 6;
  ui32Protocol &= 0x00000030;
  ui32RegVal = (ui32SCR << 8) | ui32SPH_SPO | ui32Protocol | (ui32DataWidth - 1);
  (*((volatile uint32_t *)(ui32Base + 0x00000000))) = ui32RegVal;
}
```