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

```asm
<BWTIncMergeBwt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %r8d,-0x54(%rbp)
  mov    %r9d,-0x58(%rbp)
  movl   $0x1e,-0x14(%rbp)
  movl   $0x0,-0x2c(%rbp)
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  movl   $0x0,-0x20(%rbp)
  movl   $0x0,-0x1c(%rbp)
  mov    -0x50(%rbp),%rax
  movl   $0x0,(%rax)
  jmp    L101
L31:
  mov    -0x28(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  je     L108
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x28(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    $0xf,%eax
  sub    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  or     %esi,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x24(%rbp)
  addl   $0x1,-0x1c(%rbp)
  cmpl   $0x10,-0x1c(%rbp)
  jne    L108
  movl   $0x0,-0x1c(%rbp)
  addl   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movl   $0x0,(%rax)
L108:
  addl   $0x1,-0x28(%rbp)
L213:
  mov    -0x28(%rbp),%eax
  cmp    -0x58(%rbp),%eax
  ja     L19
  mov    -0x28(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x2c(%rbp)
  jae    L31
L19:
  mov    -0x28(%rbp),%eax
  cmp    -0x58(%rbp),%eax
  ja     L82
  mov    -0x28(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x30(%rbp)
  jmp    L54
L82:
  mov    -0x54(%rbp),%eax
  mov    %eax,-0x30(%rbp)
L54:
  mov    -0x30(%rbp),%eax
  sub    -0x2c(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x2c(%rbp),%eax
  shr    $0x4,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jbe    L199
  mov    -0xc(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x1c(%rbp),%eax
  sub    -0xc(%rbp),%eax
  add    $0x10,%eax
  add    %eax,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    %edx,%eax
  or     %eax,%esi
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  or     %esi,%edx
  mov    %edx,(%rax)
  mov    $0x10,%eax
  sub    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  cmp    %eax,%edx
  cmovbe %edx,%eax
  add    %eax,-0x2c(%rbp)
  jmp    L215
L163:
  addl   $0x1,-0x18(%rbp)
  addl   $0x1,-0x20(%rbp)
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x4(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  or     %esi,%edx
  mov    %edx,(%rax)
  addl   $0x10,-0x2c(%rbp)
L215:
  mov    -0x30(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  ja     L163
  jmp    L232
L199:
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jae    L15
  mov    -0x1c(%rbp),%eax
  sub    -0xc(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  add    $0x10,%eax
  add    %eax,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  or     %esi,%edx
  mov    %edx,(%rax)
  mov    $0x10,%eax
  sub    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  cmp    %eax,%edx
  cmovbe %edx,%eax
  add    %eax,-0x2c(%rbp)
  jmp    L85
L47:
  addl   $0x1,-0x18(%rbp)
  addl   $0x1,-0x20(%rbp)
  mov    -0x18(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x4(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  or     %esi,%edx
  mov    %edx,(%rax)
  addl   $0x10,-0x2c(%rbp)
L85:
  mov    -0x30(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  ja     L47
  jmp    L232
L15:
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  or     %esi,%edx
  mov    %edx,(%rax)
  mov    $0x10,%eax
  sub    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  cmp    %eax,%edx
  cmovbe %edx,%eax
  add    %eax,-0x2c(%rbp)
  jmp    L220
L10:
  addl   $0x1,-0x18(%rbp)
  addl   $0x1,-0x20(%rbp)
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    -0x20(%rbp),%edx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x50(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x10,-0x2c(%rbp)
L220:
  mov    -0x30(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  ja     L10
L232:
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x10(%rbp),%eax
  add    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  shr    $0x4,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x24(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x0,-0x1c(%rbp)
  jne    L152
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movl   $0x0,(%rax)
  jmp    L101
L152:
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    $0x10,%eax
  sub    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %edx,%esi
  mov    %eax,%ecx
  shr    %cl,%esi
  mov    $0x10,%eax
  sub    -0x1c(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  mov    %edx,%ecx
  shl    %cl,%esi
  mov    %esi,%edx
  mov    %edx,(%rax)
L101:
  mov    -0x2c(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jb     L213
  jmp    L188
L227:
  mov    -0x28(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  je     L75
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x28(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    $0xf,%eax
  sub    -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  or     %esi,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x24(%rbp)
  addl   $0x1,-0x1c(%rbp)
  cmpl   $0x10,-0x1c(%rbp)
  jne    L75
  movl   $0x0,-0x1c(%rbp)
  addl   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movl   $0x0,(%rax)
L75:
  addl   $0x1,-0x28(%rbp)
L188:
  mov    -0x28(%rbp),%eax
  cmp    -0x58(%rbp),%eax
  jbe    L227
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void BWTIncMergeBwt(const unsigned int *sortedRank, const unsigned int *oldBwt, const unsigned int *insertBwt, unsigned int *__restrict mergedBwt, const unsigned int numOldBwt, const unsigned int numInsertBwt) {
  unsigned int bitsInWordMinusBitPerChar;
  unsigned int leftShift, rightShift;
  unsigned int o;
  unsigned int oIndex, iIndex, mIndex;
  unsigned int mWord, mChar, oWord, oChar;
  unsigned int numInsert;
  bitsInWordMinusBitPerChar = 32 - 2;
  oIndex = 0;
  iIndex = 0;
  mIndex = 0;
  mWord = 0;
  mChar = 0;
  mergedBwt[0] = 0;
  while (oIndex < numOldBwt) {
    while (iIndex <= numInsertBwt && sortedRank[iIndex] <= oIndex) {
      if (sortedRank[iIndex] != 0) {
        mergedBwt[mWord] |= insertBwt[iIndex] << (32 - (mChar + 1) * 2);
        mIndex++;
        mChar++;
        if (mChar == 16) {
          mChar = 0;
          mWord++;
          mergedBwt[mWord] = 0;
        }
      }
      iIndex++;
    }
    if (iIndex <= numInsertBwt) {
      o = sortedRank[iIndex];
    } else {
      o = numOldBwt;
    }
    numInsert = o - oIndex;
    oWord = oIndex / 16;
    oChar = oIndex - oWord * 16;
    if (oChar > mChar) {
      leftShift = (oChar - mChar) * 2;
      rightShift = (16 + mChar - oChar) * 2;
      mergedBwt[mWord] = mergedBwt[mWord] | (oldBwt[oWord] << (oChar * 2) >> (mChar * 2)) | (oldBwt[oWord + 1] >> rightShift);
      oIndex += (((numInsert) < (16 - mChar)) ? (numInsert) : (16 - mChar));
      while (o > oIndex) {
        oWord++;
        mWord++;
        mergedBwt[mWord] = (oldBwt[oWord] << leftShift) | (oldBwt[oWord + 1] >> rightShift);
        oIndex += 16;
      }
    } else if (oChar < mChar) {
      rightShift = (mChar - oChar) * 2;
      leftShift = (16 + oChar - mChar) * 2;
      mergedBwt[mWord] = mergedBwt[mWord] | (oldBwt[oWord] << (oChar * 2) >> (mChar * 2));
      oIndex += (((numInsert) < (16 - mChar)) ? (numInsert) : (16 - mChar));
      while (o > oIndex) {
        oWord++;
        mWord++;
        mergedBwt[mWord] = (oldBwt[oWord - 1] << leftShift) | (oldBwt[oWord] >> rightShift);
        oIndex += 16;
      }
    } else {
      mergedBwt[mWord] = mergedBwt[mWord] | ((oldBwt[oWord]) << (mChar * 2) >> (mChar * 2));
      oIndex += (((numInsert) < (16 - mChar)) ? (numInsert) : (16 - mChar));
      while (o > oIndex) {
        oWord++;
        mWord++;
        mergedBwt[mWord] = oldBwt[oWord];
        oIndex += 16;
      }
    }
    oIndex = o;
    mIndex += numInsert;
    mWord = mIndex / 16;
    mChar = mIndex - mWord * 16;
    if (mChar == 0) {
      mergedBwt[mWord] = 0;
    } else {
      mergedBwt[mWord] = ((mergedBwt[mWord]) >> ((32 - mChar * 2)) << ((32 - mChar * 2)));
    }
  }
  while (iIndex <= numInsertBwt) {
    if (sortedRank[iIndex] != 0) {
      mergedBwt[mWord] |= insertBwt[iIndex] << (32 - (mChar + 1) * 2);
      mIndex++;
      mChar++;
      if (mChar == 16) {
        mChar = 0;
        mWord++;
        mergedBwt[mWord] = 0;
      }
    }
    iIndex++;
  }
}
```