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

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

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