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

```asm
<mixcolumns>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1c(%rbp)
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1b(%rbp)
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1a(%rbp)
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x19(%rbp)
  movzbl -0x1c(%rbp),%eax
  movzbl %al,%eax
  mov    $0x2,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %eax,%ebx
  movzbl -0x19(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x1a(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x1b(%rbp),%eax
  movzbl %al,%eax
  mov    $0x3,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %ebx,%edx
  xor    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %dl,(%rax)
  movzbl -0x1b(%rbp),%eax
  movzbl %al,%eax
  mov    $0x2,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %eax,%ebx
  movzbl -0x1c(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x19(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x1a(%rbp),%eax
  movzbl %al,%eax
  mov    $0x3,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %ebx,%edx
  xor    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %dl,(%rax)
  movzbl -0x1a(%rbp),%eax
  movzbl %al,%eax
  mov    $0x2,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %eax,%ebx
  movzbl -0x1b(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x1c(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x19(%rbp),%eax
  movzbl %al,%eax
  mov    $0x3,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %ebx,%edx
  xor    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %dl,(%rax)
  movzbl -0x19(%rbp),%eax
  movzbl %al,%eax
  mov    $0x2,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %eax,%ebx
  movzbl -0x1a(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x1b(%rbp),%eax
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  xor    %eax,%ebx
  movzbl -0x1c(%rbp),%eax
  movzbl %al,%eax
  mov    $0x3,%esi
  mov    %eax,%edi
  call   <galois_multiply@plt>
  mov    %ebx,%edx
  xor    %eax,%edx
  mov    -0x40(%rbp),%rax
  mov    %dl,(%rax)
  nop
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L6
  call   <__stack_chk_fail@plt>
L6:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void mixcolumns(unsigned char *state0, unsigned char *state1, unsigned char *state2, unsigned char *state3) {
  unsigned char temp[4] = {*state0, *state1, *state2, *state3};
  *state0 = galois_multiply(temp[0], 2) ^ galois_multiply(temp[3], 1) ^ galois_multiply(temp[2], 1) ^ galois_multiply(temp[1], 3);
  *state1 = galois_multiply(temp[1], 2) ^ galois_multiply(temp[0], 1) ^ galois_multiply(temp[3], 1) ^ galois_multiply(temp[2], 3);
  *state2 = galois_multiply(temp[2], 2) ^ galois_multiply(temp[1], 1) ^ galois_multiply(temp[0], 1) ^ galois_multiply(temp[3], 3);
  *state3 = galois_multiply(temp[3], 2) ^ galois_multiply(temp[2], 1) ^ galois_multiply(temp[1], 1) ^ galois_multiply(temp[0], 3);
}
```