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

```asm
<alpha_rotate>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %edx,-0x40(%rbp)
  mov    %ecx,-0x44(%rbp)
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <assert@plt>
  cmpl   $0x3,-0x44(%rbp)
  je     L88
  cmpl   $0x3,-0x44(%rbp)
  jg     L120
  cmpl   $0x1,-0x44(%rbp)
  je     L132
  cmpl   $0x2,-0x44(%rbp)
  je     L17
  jmp    L120
L132:
  mov    -0x40(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x20(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L96
L76:
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L68
L97:
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  addl   $0x1,-0x28(%rbp)
  mov    -0x40(%rbp),%eax
  cltq
  add    %rax,-0x18(%rbp)
L68:
  mov    -0x28(%rbp),%eax
  cmp    -0x3c(%rbp),%eax
  jl     L97
  addl   $0x1,-0x24(%rbp)
  subq   $0x1,-0x20(%rbp)
L96:
  mov    -0x24(%rbp),%eax
  cmp    -0x40(%rbp),%eax
  jl     L76
  jmp    L120
L17:
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  cltq
  add    %rax,-0x38(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  jmp    L128
L56:
  mov    -0x38(%rbp),%rdx
  lea    -0x1(%rdx),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x20(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  subl   $0x1,-0x24(%rbp)
L128:
  cmpl   $0x0,-0x24(%rbp)
  jg     L56
  jmp    L120
L88:
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L0
L26:
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L8
L101:
  mov    -0x40(%rbp),%eax
  cltq
  neg    %rax
  add    %rax,-0x10(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  movzbl (%rax),%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
  addl   $0x1,-0x28(%rbp)
L8:
  mov    -0x28(%rbp),%eax
  cmp    -0x3c(%rbp),%eax
  jl     L101
  addl   $0x1,-0x24(%rbp)
  addq   $0x1,-0x20(%rbp)
L0:
  mov    -0x24(%rbp),%eax
  cmp    -0x40(%rbp),%eax
  jl     L26
  nop
L120:
  mov    -0x8(%rbp),%rax
  leave
  ret
```

assistant: ```c
unsigned char *alpha_rotate(unsigned char *i, int ox, int oy, int rot) {
  unsigned char *n, *p;
  int x, y;
  assert(n = (unsigned char *)malloc(ox * oy));
  switch (rot) {
  case 1:
    p = n + (oy - 1);
    for (y = 0; y < oy; y++, p--) {
      unsigned char *r = p;
      for (x = 0; x < ox; x++, r += oy)
        *r = *(i++);
    }
    break;
  case 2:
    i += ox * oy;
    p = n;
    for (y = ox * oy; y > 0; y--)
      *(p++) = *(i--);
    break;
  case 3:
    p = n;
    for (y = 0; y < oy; y++, p++) {
      unsigned char *r = p + (ox * oy);
      for (x = 0; x < ox; x++) {
        r -= oy;
        *r = *(i++);
      }
    }
    break;
  }
  return (n);
}
```