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

```asm
<iCvmDoVerify>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  movl   $0x0,(%rsi)
  movzbl (%rdi),%eax
  and    $0x3f,%eax
  cmp    $0x20,%al
  ja     L160
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  movzbl %al,%eax
  lea    D0(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  mov    $0x8,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  mov    $0x0,%eax
  call   <iCvmVerifyOfflinePlainPin@plt>
  test   %eax,%eax
  jne    L263
  movb   $0x2,0x2(%rbx)
  jmp    L265
L263:
  cmp    $0xffffffff,%eax
  jne    L59
  jmp    L212
  mov    $0x8,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  mov    $0xa,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  movl   $0x1,0x0(%rbp)
  mov    $0x0,%eax
  call   <iCvmVerifyOfflinePlainPin@plt>
  test   %eax,%eax
  jne    L184
  movb   $0x0,0x2(%rbx)
  jmp    L265
L184:
  cmp    $0xffffffff,%eax
  jne    L59
  jmp    L212
  mov    $0x9,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  mov    $0x0,%eax
  call   <iCvmEnterOnlinePin@plt>
  test   %eax,%eax
  je     L169
  cmp    $0x1,%eax
  jne    L59
L212:
  movb   $0x1,0x2(%rbx)
  mov    $0xfffffffd,%eax
  jmp    L59
L169:
  movb   $0x0,0x2(%rbx)
  mov    $0x1,%edx
  mov    $0x15,%esi
  mov    $0x2,%edi
  call   <iEmvSetItemBit@plt>
  jmp    L265
  mov    $0xb,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
L179:
  mov    $0xfffffffe,%eax
  jmp    L59
  mov    $0xb,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  mov    $0xa,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  movl   $0x1,0x0(%rbp)
  jmp    L179
  mov    $0xa,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  movl   $0x1,0x0(%rbp)
  movb   $0x0,0x2(%rbx)
L265:
  mov    $0x0,%eax
  jmp    L59
  mov    $0xc,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  movb   $0x2,0x2(%rbx)
  jmp    L265
  mov    $0xf,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L179
  mov    $0x0,%eax
  call   <iEmvTermEnvironment@plt>
  cmp    $0x1,%eax
  jne    L179
  mov    $0x0,%eax
  call   <iCvmVerifyHolderId@plt>
  test   %eax,%eax
  jne    L19
  movb   $0x2,0x2(%rbx)
  jmp    L265
L19:
  cmp    $0xffffffff,%eax
  jne    L59
  jmp    L212
L160:
  mov    $0x1,%edx
  mov    $0x11,%esi
  mov    $0x2,%edi
  call   <iEmvSetItemBit@plt>
  mov    $0xffffffff,%eax
L59:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
```

assistant: ```c
int iCvmDoVerify(unsigned char *psCvmResult, int *piNeedSignFlag) {
  int iRet;
  int iCvmRecognisedFlag;
  int iCvmSupportFlag;
  int iCvmPassFlag;
  iCvmSupportFlag = 0;
  *piNeedSignFlag = 0;
  iCvmRecognisedFlag = 1;
  iCvmPassFlag = 0;
  switch (psCvmResult[0] & 0x3F) {
  case 0:
    iCvmSupportFlag = 1;
    psCvmResult[2] = 1;
    break;
  case 1:
    if (iEmvTestItemBit(4, 8) == 0)
      break;
    iCvmSupportFlag = 1;
    iRet = iCvmVerifyOfflinePlainPin();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 2;
      break;
    }
    if (iRet == -1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
  case 3:
    if (iEmvTestItemBit(4, 8) == 0)
      break;
    if (iEmvTestItemBit(4, 10) == 0)
      break;
    *piNeedSignFlag = 1;
    iCvmSupportFlag = 1;
    iRet = iCvmVerifyOfflinePlainPin();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 0;
      break;
    }
    if (iRet == -1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
  case 2:
    if (iEmvTestItemBit(4, 9) == 0)
      break;
    iCvmSupportFlag = 1;
    iRet = iCvmEnterOnlinePin();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 0;
      iEmvSetItemBit(2, 21, 1);
      break;
    }
    if (iRet == 1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
    break;
  case 4:
    if (iEmvTestItemBit(4, 11) == 0)
      break;
    break;
  case 5:
    if (iEmvTestItemBit(4, 11) == 0)
      break;
    if (iEmvTestItemBit(4, 10) == 0)
      break;
    *piNeedSignFlag = 1;
    break;
  case 0x1E:
    if (iEmvTestItemBit(4, 10) == 0)
      break;
    iCvmSupportFlag = 1;
    *piNeedSignFlag = 1;
    psCvmResult[2] = 0;
    iCvmPassFlag = 1;
    break;
  case 0x1F:
    if (iEmvTestItemBit(4, 12) == 0)
      break;
    iCvmSupportFlag = 1;
    psCvmResult[2] = 2;
    iCvmPassFlag = 1;
    break;
  case 0x20:
    if (iEmvTestItemBit(4, 15) == 0)
      break;
    if (iEmvTermEnvironment() != 1)
      break;
    iCvmSupportFlag = 1;
    iRet = iCvmVerifyHolderId();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 2;
      break;
    }
    if (iRet == -1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
    break;
  default:
    iCvmRecognisedFlag = 0;
    break;
  }
  if (iCvmRecognisedFlag == 0) {
    iEmvSetItemBit(2, 17, 1);
    return (-1);
  }
  if (iCvmSupportFlag == 0) {
    return (-2);
  }
  if (iCvmPassFlag == 0) {
    return (-3);
  }
  return (0);
}
```