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

```asm
<scan_uuencoded>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  mov    %rdi,-0x30(%rbp)
  mov    %rsi,-0x38(%rbp)
  mov    %rdx,-0x40(%rbp)
  mov    -0x30(%rbp),%rbx
  movq   $0x0,-0x18(%rbp)
  movzbl (%rbx),%eax
  movzbl %al,%eax
  sub    $0x20,%eax
  cltq
  mov    %rax,-0x20(%rbp)
  cmpq   $0x40,-0x20(%rbp)
  jbe    L135
  mov    $0x0,%eax
  jmp    L70
L135:
  andq   $0x3f,-0x20(%rbp)
  add    $0x1,%rbx
  jmp    L140
L46:
  movzbl (%rbx),%eax
  cmp    $0x60,%al
  ja     L4
  lea    0x1(%rbx),%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  ja     L4
  lea    0x2(%rbx),%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  ja     L4
  lea    0x3(%rbx),%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jbe    L25
L4:
  mov    $0x0,%eax
  jmp    L70
L25:
  movzbl (%rbx),%eax
  movzbl %al,%eax
  sub    $0x20,%eax
  shl    $0x12,%eax
  and    $0xfc0000,%eax
  mov    %eax,%edx
  lea    0x1(%rbx),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sub    $0x20,%eax
  shl    $0xc,%eax
  and    $0x3f000,%eax
  or     %eax,%edx
  lea    0x2(%rbx),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sub    $0x20,%eax
  shl    $0x6,%eax
  and    $0xfc0,%eax
  add    %eax,%edx
  lea    0x3(%rbx),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sub    $0x20,%eax
  and    $0x3f,%eax
  add    %edx,%eax
  cltq
  mov    %rax,-0x10(%rbp)
  add    $0x4,%rbx
  cmpq   $0x0,-0x20(%rbp)
  je     L101
  cmpq   $0x0,-0x38(%rbp)
  je     L23
  mov    -0x10(%rbp),%rax
  shr    $0x10,%rax
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x38(%rbp),%rdx
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
L23:
  subq   $0x1,-0x20(%rbp)
L101:
  cmpq   $0x0,-0x20(%rbp)
  je     L28
  cmpq   $0x0,-0x38(%rbp)
  je     L77
  mov    -0x10(%rbp),%rax
  shr    $0x8,%rax
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x38(%rbp),%rdx
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
L77:
  subq   $0x1,-0x20(%rbp)
L28:
  cmpq   $0x0,-0x20(%rbp)
  je     L140
  cmpq   $0x0,-0x38(%rbp)
  je     L131
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x38(%rbp),%rdx
  add    %rdx,%rax
  mov    -0x10(%rbp),%rdx
  mov    %dl,(%rax)
L131:
  subq   $0x1,-0x20(%rbp)
L140:
  cmpq   $0x0,-0x20(%rbp)
  jne    L46
  cmpq   $0x0,-0x40(%rbp)
  je     L107
  mov    -0x40(%rbp),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rdx,(%rax)
L107:
  mov    %rbx,%rax
  sub    -0x30(%rbp),%rax
L70:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
size_t scan_uuencoded(const char *src, char *dest, size_t *destlen) {
  size_t len;
  size_t tmp;
  register const unsigned char *s = (const unsigned char *)src;
  size_t i = 0;
  if ((len = *s - ' ') > 64)
    return 0;
  len &= 63;
  ++s;
  while (len > 0) {
    if (s[0] - ' ' > 64 || s[1] - ' ' > 64 || s[2] - ' ' > 64 || s[3] - ' ' > 64)
      return 0;
    tmp = (((s[0] - ' ') & 077) << (3 * 6)) + (((s[1] - ' ') & 077) << (2 * 6)) + (((s[2] - ' ') & 077) << (1 * 6)) + (((s[3] - ' ') & 077));
    s += 4;
    if (len) {
      if (dest)
        dest[i++] = tmp >> 16;
      --len;
    }
    if (len) {
      if (dest)
        dest[i++] = tmp >> 8;
      --len;
    }
    if (len) {
      if (dest)
        dest[i++] = tmp & 0xff;
      --len;
    }
  }
  if (destlen)
    *destlen = i;
  return (const char *)s - src;
}
```