user: 下面的汇编指令对应的C源代码是什么:

```asm
<Assign_State>:
  endbr64
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  movl   $0xffffffff,0xc(%rsp)
  test   %esi,%esi
  jne    L348
  test   %edx,%edx
  jle    L104
  mov    $0x0,%ecx
  mov    $0xffffffff,%r11d
  lea    D19(%rip),%r8
  mov    $0x1,%ebx
  mov    $0x3,%r9d
  mov    $0x2,%r10d
  jmp    L15
  mov    %esi,%eax
  jmp    L212
  mov    %r10d,%eax
L212:
  mov    %eax,0xc(%rsp,%rcx,4)
  add    $0x1,%rcx
  cmp    %ecx,%edx
  jle    L104
L15:
  movzbl (%rdi,%rcx,1),%eax
  sub    $0x41,%eax
  cmp    $0x14,%al
  ja     L101
  movzbl %al,%eax
  movslq (%r8,%rax,4),%rax
  add    %r8,%rax
  notrack jmp *%rax
  mov    %r9d,%eax
  jmp    L212
  mov    %r9d,%eax
  jmp    L212
L101:
  mov    %r11d,%eax
  jmp    L212
  mov    %ebx,%eax
  jmp    L212
L104:
  cmp    $0x1,%edx
  jle    L170
  mov    0xc(%rsp),%edx
  mov    0x10(%rsp),%eax
  lea    (%rax,%rdx,4),%edx
  mov    0x14(%rsp),%eax
  lea    (%rax,%rdx,4),%eax
  jmp    L158
L170:
  mov    0xc(%rsp),%eax
  jmp    L158
L348:
  movzbl (%rdi),%eax
  sub    $0x41,%eax
  cmp    $0x19,%al
  ja     L30
  movzbl %al,%eax
  lea    D4(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  movl   $0x0,0xc(%rsp)
L30:
  mov    0xc(%rsp),%eax
L158:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L195
  add    $0x20,%rsp
  pop    %rbx
  ret
  movl   $0x1,0xc(%rsp)
  jmp    L30
  movl   $0x2,0xc(%rsp)
  jmp    L30
  movl   $0x3,0xc(%rsp)
  jmp    L30
  movl   $0x4,0xc(%rsp)
  jmp    L30
  movl   $0x5,0xc(%rsp)
  jmp    L30
  movl   $0x6,0xc(%rsp)
  jmp    L30
  movl   $0x7,0xc(%rsp)
  jmp    L30
  movl   $0x8,0xc(%rsp)
  jmp    L30
  movl   $0x9,0xc(%rsp)
  jmp    L30
  movl   $0xa,0xc(%rsp)
  jmp    L30
  movl   $0xb,0xc(%rsp)
  jmp    L30
  movl   $0xc,0xc(%rsp)
  jmp    L30
  movl   $0xd,0xc(%rsp)
  jmp    L30
  movl   $0xe,0xc(%rsp)
  jmp    L30
  movl   $0xf,0xc(%rsp)
  jmp    L30
  movl   $0x10,0xc(%rsp)
  jmp    L30
  movl   $0x11,0xc(%rsp)
  jmp    L30
  movl   $0x12,0xc(%rsp)
  jmp    L30
  movl   $0x13,0xc(%rsp)
  jmp    L30
  movl   $0x2,0xc(%rsp)
  jmp    L30
  movl   $0x5,0xc(%rsp)
  jmp    L30
L195:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int Assign_State(char *c, int datatype, int stepsize) {
  int state[3];
  int i;
  state[0] = -1;
  if (!datatype) {
    for (i = 0; i < stepsize; i++) {
      switch (c[i]) {
      case 'A':
        state[i] = 0;
        break;
      case 'C':
        state[i] = 1;
        break;
      case 'G':
        state[i] = 2;
        break;
      case 'T':
        state[i] = 3;
        break;
      case 'U':
        state[i] = 3;
        break;
      default:
        state[i] = -1;
        break;
      }
    }
    return (stepsize > 1) ? (state[0] * 16 + state[1] * 4 + state[2]) : (state[0]);
  } else {
    switch (c[0]) {
    case 'A':
      state[0] = 0;
      break;
    case 'R':
      state[0] = 1;
      break;
    case 'N':
      state[0] = 2;
      break;
    case 'D':
      state[0] = 3;
      break;
    case 'C':
      state[0] = 4;
      break;
    case 'Q':
      state[0] = 5;
      break;
    case 'E':
      state[0] = 6;
      break;
    case 'G':
      state[0] = 7;
      break;
    case 'H':
      state[0] = 8;
      break;
    case 'I':
      state[0] = 9;
      break;
    case 'L':
      state[0] = 10;
      break;
    case 'K':
      state[0] = 11;
      break;
    case 'M':
      state[0] = 12;
      break;
    case 'F':
      state[0] = 13;
      break;
    case 'P':
      state[0] = 14;
      break;
    case 'S':
      state[0] = 15;
      break;
    case 'T':
      state[0] = 16;
      break;
    case 'W':
      state[0] = 17;
      break;
    case 'Y':
      state[0] = 18;
      break;
    case 'V':
      state[0] = 19;
      break;
    case 'B':
      state[0] = 2;
      break;
    case 'Z':
      state[0] = 5;
      break;
    default:
      state[0] = -1;
      break;
    }
    return state[0];
  }
  return -1;
}
```