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

```asm
<base64_decode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L13
  cmpl   $0x0,-0x24(%rbp)
  jne    L107
L13:
  mov    $0x0,%eax
  jmp    L117
L107:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L69:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <base64_value@plt>
  mov    %al,-0xc(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <base64_value@plt>
  mov    %al,-0xb(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <base64_value@plt>
  mov    %al,-0xa(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <base64_value@plt>
  mov    %al,-0x9(%rbp)
  movsbl -0xc(%rbp),%eax
  shl    $0x2,%eax
  mov    %eax,%esi
  movzbl -0xb(%rbp),%eax
  sar    $0x4,%al
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     %ecx,%esi
  mov    %esi,%edx
  mov    %dl,(%rax)
  movsbl -0xb(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%esi
  movzbl -0xa(%rbp),%eax
  sar    $0x2,%al
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     %ecx,%esi
  mov    %esi,%edx
  mov    %dl,(%rax)
  movsbl -0xa(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     -0x9(%rbp),%cl
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isbase64@plt>
  test   %eax,%eax
  jne    L30
  subq   $0x2,-0x8(%rbp)
  jmp    L89
L30:
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isbase64@plt>
  test   %eax,%eax
  jne    L118
  subq   $0x2,-0x8(%rbp)
  jmp    L89
L118:
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isbase64@plt>
  test   %eax,%eax
  jne    L31
  subq   $0x1,-0x8(%rbp)
  jmp    L89
L31:
  addq   $0x4,-0x20(%rbp)
  jmp    L124
L5:
  addq   $0x1,-0x20(%rbp)
L124:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L91
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  je     L5
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L5
L91:
  subl   $0x4,-0x24(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  jne    L69
L89:
  mov    -0x8(%rbp),%rax
  movb   $0x0,(%rax)
  mov    -0x8(%rbp),%rax
  sub    -0x18(%rbp),%rax
L117:
  leave
  ret
```

assistant: ```c
int base64_decode(char *dest, char *src, int srclen) {
  if (*src == 0 || srclen == 0) {
    return 0;
  }
  char *p = dest;
  do {
    char a = base64_value(src[0]);
    char b = base64_value(src[1]);
    char c = base64_value(src[2]);
    char d = base64_value(src[3]);
    *p++ = (a << 2) | (b >> 4);
    *p++ = (b << 4) | (c >> 2);
    *p++ = (c << 6) | d;
    if (!isbase64(src[1])) {
      p -= 2;
      break;
    } else if (!isbase64(src[2])) {
      p -= 2;
      break;
    } else if (!isbase64(src[3])) {
      p--;
      break;
    }
    src += 4;
    while (*src && (*src == 13 || *src == 10))
      src++;
  } while (srclen -= 4);
  *p = 0;
  return p - dest;
}
```