user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<HandleInstruction>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edx,%r13d
  mov    %rcx,%rbx
  mov    %r8d,%ebp
  lea    -0x10(%rdi),%edx
  cmp    $0x51,%dl
  ja     L102
  mov    %esi,%r12d
  movzbl %dl,%edx
  lea    D2(%rip),%rcx
  movslq (%rcx,%rdx,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
L102:
  mov    %bpl,0x1b(%rbx)
  mov    %ebp,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  mov    %rbx,%rdx
  mov    %r13d,%esi
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r12d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %r12d,%esi
  sub    %eax,%esi
  mov    %rbx,%rdx
  mov    $0x17,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  sub    %r13d,%eax
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    $0x17,%edi
  call   <StoreRegister@plt>
  jmp    L102
  lea    -0x3(%rsi,%rsi,2),%esi
  mov    %esi,%ebp
  mov    %rbx,%rdx
  mov    $0x16,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r14d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  lea    (%r14,%rax,1),%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  lea    (%rax,%r13,1),%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r14d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %r14d,%esi
  sub    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  sub    %r13d,%eax
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r14d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %r14d,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %r13d,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r14d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %r14d,%esi
  mov    %eax,%ecx
  sar    %cl,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %r13d,%ecx
  sar    %cl,%eax
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r14d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %r14d,%esi
  and    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  and    %r13d,%eax
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r14d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %r14d,%esi
  or     %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  or     %r13d,%eax
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  mov    %eax,%r14d
  mov    %rbx,%rsi
  mov    %r13d,%edi
  call   <LoadRegister@plt>
  mov    %r14d,%esi
  xor    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <LoadRegister@plt>
  xor    %r13d,%eax
  mov    %eax,%esi
  mov    %rbx,%rdx
  mov    %r12d,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    $0x17,%edi
  call   <LoadRegister@plt>
  test   %eax,%eax
  jne    L102
  lea    -0x3(%r12,%r12,2),%esi
  mov    %esi,%ebp
  mov    %rbx,%rdx
  mov    $0x16,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    $0x17,%edi
  call   <LoadRegister@plt>
  test   %eax,%eax
  je     L102
  lea    -0x3(%r12,%r12,2),%esi
  mov    %esi,%ebp
  mov    %rbx,%rdx
  mov    $0x16,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    $0x17,%edi
  call   <LoadRegister@plt>
  cmp    $0x7f,%eax
  jg     L102
  lea    -0x3(%r12,%r12,2),%esi
  mov    %esi,%ebp
  mov    %rbx,%rdx
  mov    $0x16,%edi
  call   <StoreRegister@plt>
  jmp    L102
  mov    %rbx,%rsi
  mov    $0x17,%edi
  call   <LoadRegister@plt>
  cmp    $0x7f,%eax
  jle    L102
  lea    -0x3(%r12,%r12,2),%esi
  mov    %esi,%ebp
  mov    %rbx,%rdx
  mov    $0x16,%edi
  call   <StoreRegister@plt>
  jmp    L102
```

assistant: ```c
int HandleInstruction(char instruction, int arg1, int arg2, char *registers, int i) {
  switch (instruction) {
  case 0b01100000:
    StoreRegister(arg1, LoadRegister(arg2, registers), registers);
    break;
  case 0b01100001:
    StoreRegister(arg1, arg2, registers);
    break;
  case 0b001000000:
    StoreRegister(0b00010111, (LoadRegister(arg1, registers) - LoadRegister(arg2, registers)), registers);
    break;
  case 0b001000001:
    StoreRegister(0b00010111, (LoadRegister(arg1, registers) - arg2), registers);
    break;
  case 0b001010000:
    i = (arg1 * 3) - 3;
    StoreRegister(0b00010110, i, registers);
    break;
  case 0b00010000:
    StoreRegister(arg1, (LoadRegister(arg1, registers) + LoadRegister(arg2, registers)), registers);
    break;
  case 0b00010001:
    StoreRegister(arg1, (LoadRegister(arg1, registers) + arg2), registers);
    break;
  case 0b00010010:
    StoreRegister(arg1, (LoadRegister(arg1, registers) - LoadRegister(arg2, registers)), registers);
    break;
  case 0b00010011:
    StoreRegister(arg1, (LoadRegister(arg1, registers) - arg2), registers);
    break;
  case 0b00100000:
    StoreRegister(arg1, (LoadRegister(arg1, registers) << LoadRegister(arg2, registers)), registers);
    break;
  case 0b00100001:
    StoreRegister(arg1, (LoadRegister(arg1, registers) << arg2), registers);
    break;
  case 0b00100010:
    StoreRegister(arg1, (LoadRegister(arg1, registers) >> LoadRegister(arg2, registers)), registers);
    break;
  case 0b00100011:
    StoreRegister(arg1, (LoadRegister(arg1, registers) >> arg2), registers);
    break;
  case 0b00110000:
    StoreRegister(arg1, (LoadRegister(arg1, registers) & LoadRegister(arg2, registers)), registers);
    break;
  case 0b00110001:
    StoreRegister(arg1, (LoadRegister(arg1, registers) & arg2), registers);
    break;
  case 0b00110010:
    StoreRegister(arg1, (LoadRegister(arg1, registers) | LoadRegister(arg2, registers)), registers);
    break;
  case 0b00110011:
    StoreRegister(arg1, (LoadRegister(arg1, registers) | arg2), registers);
    break;
  case 0b00110100:
    StoreRegister(arg1, (LoadRegister(arg1, registers) ^ LoadRegister(arg2, registers)), registers);
    break;
  case 0b00110101:
    StoreRegister(arg1, (LoadRegister(arg1, registers) ^ arg2), registers);
    break;
  case 0b01010010:
    if (LoadRegister(0b00010111, registers) == 0) {
      i = (arg1 * 3) - 3;
      StoreRegister(0b00010110, i, registers);
    }
    break;
  case 0b01010100:
    if (LoadRegister(0b00010111, registers) != 0) {
      i = (arg1 * 3) - 3;
      StoreRegister(0b00010110, i, registers);
    }
    break;
  case 0b01010110:
    if (LoadRegister(0b00010111, registers) < 128) {
      i = (arg1 * 3) - 3;
      StoreRegister(0b00010110, i, registers);
    }
    break;
  case 0b01011000:
    if (LoadRegister(0b00010111, registers) > 127) {
      i = (arg1 * 3) - 3;
      StoreRegister(0b00010110, i, registers);
    }
    break;
  }
  registers[27] = i;
  return i;
}
```