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

```asm
<morus_enc_aut_partialblock>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x30(%rbp),%rax
  mov    $0x10,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x48(%rbp),%rdx
  mov    -0x38(%rbp),%rcx
  lea    -0x30(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  lea    -0x30(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  xor    %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x10,%rax
  mov    0x4(%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0x50(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%edx
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%eax
  and    %eax,%edx
  lea    -0x20(%rbp),%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  lea    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x50(%rbp),%rax
  mov    0x4(%rax),%eax
  xor    %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0x50(%rbp),%rax
  add    $0x20,%rax
  mov    0x4(%rax),%edx
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  mov    0x4(%rax),%eax
  and    %eax,%edx
  lea    -0x20(%rbp),%rax
  add    $0x4,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  lea    -0x30(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%edx
  mov    -0x50(%rbp),%rax
  mov    0x8(%rax),%eax
  xor    %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x10,%rax
  mov    0xc(%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0x50(%rbp),%rax
  add    $0x20,%rax
  mov    0x8(%rax),%edx
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  mov    0x8(%rax),%eax
  and    %eax,%edx
  lea    -0x20(%rbp),%rax
  add    $0x8,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  lea    -0x30(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%edx
  mov    -0x50(%rbp),%rax
  mov    0xc(%rax),%eax
  xor    %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0x50(%rbp),%rax
  add    $0x20,%rax
  mov    0xc(%rax),%edx
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  mov    0xc(%rax),%eax
  and    %eax,%edx
  lea    -0x20(%rbp),%rax
  add    $0xc,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x50(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <morus_stateupdate@plt>
  mov    -0x48(%rbp),%rdx
  lea    -0x20(%rbp),%rcx
  mov    -0x40(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L9
  call   <__stack_chk_fail@plt>
L9:
  leave
  ret
```

assistant: ```c
void morus_enc_aut_partialblock(const unsigned char *plaintext, unsigned char *ciphertext, unsigned long long len, unsigned int state[][4]) {
  unsigned char plaintextblock[16], ciphertextblock[16];
  memset(plaintextblock, 0, 16);
  memcpy(plaintextblock, plaintext, len);
  ((unsigned int *)ciphertextblock)[0] = ((unsigned int *)plaintextblock)[0] ^ state[0][0] ^ state[1][1] ^ (state[2][0] & state[3][0]);
  ((unsigned int *)ciphertextblock)[1] = ((unsigned int *)plaintextblock)[1] ^ state[0][1] ^ state[1][2] ^ (state[2][1] & state[3][1]);
  ((unsigned int *)ciphertextblock)[2] = ((unsigned int *)plaintextblock)[2] ^ state[0][2] ^ state[1][3] ^ (state[2][2] & state[3][2]);
  ((unsigned int *)ciphertextblock)[3] = ((unsigned int *)plaintextblock)[3] ^ state[0][3] ^ state[1][0] ^ (state[2][3] & state[3][3]);
  morus_stateupdate(((unsigned int *)plaintextblock), state);
  memcpy(ciphertext, ciphertextblock, len);
}
```