user: 这段汇编代码用C语言表示是什么样的?

```asm
<gcr_encode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  mov    %rdi,-0x40(%rbp)
  mov    %rsi,-0x48(%rbp)
  mov    $0x7,%ebx
  movb   $0x0,-0x2d(%rbp)
  movl   $0x0,-0x2c(%rbp)
  jmp    L19
L20:
  cmpl   $0x100,-0x2c(%rbp)
  jne    L9
  lea    D13(%rip),%rax
  mov    %rax,-0x40(%rbp)
  movzbl -0x2d(%rbp),%eax
  mov    %al,D33(%rip)
L9:
  mov    %ebx,%eax
  shr    $0x4,%al
  movzbl %al,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%r12d
  movzbl %bl,%eax
  and    $0xf,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%ebx
  movzbl %r12b,%eax
  shl    $0x3,%eax
  mov    %eax,%edx
  mov    %ebx,%eax
  shr    $0x2,%al
  or     %edx,%eax
  mov    %eax,%ecx
  movzbl %bl,%eax
  shl    $0x6,%eax
  mov    %eax,%r15d
  mov    -0x40(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x40(%rbp)
  movzbl (%rax),%ebx
  mov    %ebx,%eax
  xor    %al,-0x2d(%rbp)
  mov    %ebx,%eax
  shr    $0x4,%al
  movzbl %al,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%r12d
  movzbl %bl,%eax
  and    $0xf,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%ebx
  movzbl %r12b,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    %ebx,%eax
  shr    $0x4,%al
  or     %edx,%eax
  mov    %r15d,%edx
  or     %edx,%eax
  mov    %eax,%r15d
  movzbl %bl,%eax
  shl    $0x4,%eax
  mov    %eax,%r14d
  mov    -0x40(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x40(%rbp)
  movzbl (%rax),%ebx
  mov    %ebx,%eax
  xor    %al,-0x2d(%rbp)
  mov    %ebx,%eax
  shr    $0x4,%al
  movzbl %al,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%r12d
  movzbl %bl,%eax
  and    $0xf,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%ebx
  mov    %r12d,%eax
  shr    %al
  or     %eax,%r14d
  movzbl %r12b,%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  movzbl %bl,%eax
  shl    $0x2,%eax
  or     %edx,%eax
  mov    %eax,%r13d
  mov    -0x40(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x40(%rbp)
  movzbl (%rax),%ebx
  mov    %ebx,%eax
  xor    %al,-0x2d(%rbp)
  mov    %ebx,%eax
  shr    $0x4,%al
  movzbl %al,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%r12d
  movzbl %bl,%eax
  and    $0xf,%eax
  cltq
  lea    D33(%rip),%rdx
  movzbl (%rax,%rdx,1),%ebx
  mov    %r12d,%eax
  shr    $0x3,%al
  or     %eax,%r13d
  movzbl %r12b,%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    %ebx,%eax
  or     %edx,%eax
  mov    %eax,%ebx
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %cl,(%rax)
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %r15b,(%rax)
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %r14b,(%rax)
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %r13b,(%rax)
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %bl,(%rax)
  mov    -0x40(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x40(%rbp)
  movzbl (%rax),%ebx
  mov    %ebx,%eax
  xor    %al,-0x2d(%rbp)
  addl   $0x4,-0x2c(%rbp)
L19:
  cmpl   $0x100,-0x2c(%rbp)
  jle    L20
  mov    $0x0,%eax
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
```

assistant: ```c
int gcr_encode(unsigned const char *block, unsigned char *encoded) {
  register unsigned char c = 0x07, h, l, g0, g1, g2, g3, g4;
  unsigned char chk = 0;
  int i;
  static const unsigned char gcr[] = {0x0a, 0x0b, 0x12, 0x13, 0x0e, 0x0f, 0x16, 0x17, 0x09, 0x19, 0x1a, 0x1b, 0x0d, 0x1d, 0x1e, 0x15};
  static unsigned char empty[] = {0x00, 0x00, 0x00, 0x00};
  for (i = 0; i <= 256; i += 4) {
    if (i == 256) {
      block = empty;
      empty[0] = chk;
    }
    h = gcr[c >> 4];
    l = gcr[c & 0x0f];
    g0 = (h << 3) | (l >> 2);
    g1 = (l & 0x03) << 6;
    chk ^= c = *(block++);
    h = gcr[c >> 4];
    l = gcr[c & 0x0f];
    g1 |= (h << 1) | (l >> 4);
    g2 = (l & 0x0f) << 4;
    chk ^= c = *(block++);
    h = gcr[c >> 4];
    l = gcr[c & 0x0f];
    g2 |= (h >> 1);
    g3 = ((h & 0x01) << 7) | (l << 2);
    chk ^= c = *(block++);
    h = gcr[c >> 4];
    l = gcr[c & 0x0f];
    g3 |= (h >> 3);
    g4 = ((h & 0x07) << 5) | (l);
    *(encoded++) = g0;
    *(encoded++) = g1;
    *(encoded++) = g2;
    *(encoded++) = g3;
    *(encoded++) = g4;
    chk ^= c = *(block++);
  }
  return 0;
}
```