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

```asm
<S_layer>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x28(%rbp),%rax
  mov    0x8(%rax),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x28(%rbp),%rax
  mov    0xc(%rax),%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  and    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%eax
  xor    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  and    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  and    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  and    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x10(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x28(%rbp),%rax
  lea    0x14(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x28(%rbp),%rax
  lea    0x18(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    0x8(%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x28(%rbp),%rax
  lea    0x1c(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    0xc(%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  and    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%ecx
  mov    -0x20(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  and    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x14,%rax
  and    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    $0x14,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  add    $0x1c,%rax
  and    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%ecx
  mov    -0x14(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    $0x1c,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L0
  call   <__stack_chk_fail@plt>
L0:
  leave
  ret
```

assistant: ```c
void S_layer(uint8_t *data) {
  uint8_t temp[4];
  temp[0] = data[0];
  temp[1] = data[1];
  temp[2] = data[2];
  temp[3] = data[3];
  data[0] &= data[2];
  data[0] ^= data[4];
  data[2] &= data[4];
  data[2] ^= data[6];
  data[1] &= data[3];
  data[1] ^= data[5];
  data[3] &= data[5];
  data[3] ^= data[7];
  data[4] = data[0];
  data[5] = data[1];
  data[6] = data[2];
  data[7] = data[3];
  data[4] &= data[6];
  data[4] ^= temp[0];
  data[6] &= data[4];
  data[6] ^= temp[2];
  data[5] &= data[7];
  data[5] ^= temp[1];
  data[7] &= data[5];
  data[7] ^= temp[3];
}
```