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

```asm
<InvMixColumn>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  mov    %al,-0x4(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  mov    %al,-0x3(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  mov    %al,-0x2(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  mov    %al,-0x1(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L181
  mov    $0x1b,%eax
  jmp    L156
L181:
  mov    $0x0,%eax
L156:
  xor    %edx,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L214
  mov    $0x1b,%eax
  jmp    L107
L214:
  mov    $0x0,%eax
L107:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L116
  mov    $0x1b,%eax
  jmp    L4
L116:
  mov    $0x0,%eax
L4:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L158
  mov    $0x1b,%eax
  jmp    L67
L158:
  mov    $0x0,%eax
L67:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x4(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x3(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x2(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x1(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L39
  mov    $0x1b,%eax
  jmp    L154
L39:
  mov    $0x0,%eax
L154:
  xor    %edx,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L14
  mov    $0x1b,%eax
  jmp    L79
L14:
  mov    $0x0,%eax
L79:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L111
  mov    $0x1b,%eax
  jmp    L70
L111:
  mov    $0x0,%eax
L70:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L49
  mov    $0x1b,%eax
  jmp    L44
L49:
  mov    $0x0,%eax
L44:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x4(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x3(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x2(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %edx,%eax
  xor    %al,-0x1(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L144
  mov    $0x1b,%eax
  jmp    L29
L144:
  mov    $0x0,%eax
L29:
  xor    %edx,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L206
  mov    $0x1b,%eax
  jmp    L223
L206:
  mov    $0x0,%eax
L223:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L38
  mov    $0x1b,%eax
  jmp    L66
L38:
  mov    $0x0,%eax
L66:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L23
  mov    $0x1b,%eax
  jmp    L169
L23:
  mov    $0x0,%eax
L169:
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%ecx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  xor    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  xor    %ecx,%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  xor    %al,-0x4(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  xor    %al,-0x3(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  xor    %al,-0x2(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  xor    %al,-0x1(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl -0x4(%rbp),%edx
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  movzbl -0x3(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x18(%rbp),%rax
  lea    0x2(%rax),%rdx
  movzbl -0x2(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x18(%rbp),%rax
  lea    0x3(%rax),%rdx
  movzbl -0x1(%rbp),%eax
  mov    %al,(%rdx)
  nop
  pop    %rbp
  ret
```

assistant: ```c
void InvMixColumn(unsigned char *column) {
  unsigned char r0, r1, r2, r3;
  r0 = column[1] ^ column[2] ^ column[3];
  r1 = column[0] ^ column[2] ^ column[3];
  r2 = column[0] ^ column[1] ^ column[3];
  r3 = column[0] ^ column[1] ^ column[2];
  column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? 0x1b : 0);
  column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? 0x1b : 0);
  column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? 0x1b : 0);
  column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? 0x1b : 0);
  r0 ^= column[0] ^ column[1];
  r1 ^= column[1] ^ column[2];
  r2 ^= column[2] ^ column[3];
  r3 ^= column[0] ^ column[3];
  column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? 0x1b : 0);
  column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? 0x1b : 0);
  column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? 0x1b : 0);
  column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? 0x1b : 0);
  r0 ^= column[0] ^ column[2];
  r1 ^= column[1] ^ column[3];
  r2 ^= column[0] ^ column[2];
  r3 ^= column[1] ^ column[3];
  column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? 0x1b : 0);
  column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? 0x1b : 0);
  column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? 0x1b : 0);
  column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? 0x1b : 0);
  column[0] ^= column[1] ^ column[2] ^ column[3];
  r0 ^= column[0];
  r1 ^= column[0];
  r2 ^= column[0];
  r3 ^= column[0];
  column[0] = r0;
  column[1] = r1;
  column[2] = r2;
  column[3] = r3;
}
```