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

```asm
<MD5_Binary>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    %rdi,%rbx
  mov    %esi,%r13d
  mov    %rdx,%r14
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  movl   $0x67452301,(%rsp)
  movl   $0xefcdab89,0x4(%rsp)
  movl   $0x98badcfe,0x8(%rsp)
  movl   $0x10325476,0xc(%rsp)
  cmp    $0x3f,%esi
  jle    L87
  lea    -0x40(%rsi),%ebp
  shr    $0x6,%ebp
  add    $0x1,%ebp
  mov    %ebp,%ebp
  shl    $0x6,%rbp
  add    %rdi,%rbp
  mov    %rsp,%r12
L102:
  lea    0x8(%rsp),%rcx
  lea    0x4(%rsp),%rdx
  lea    0xc(%rsp),%r8
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <MD5_Round_Calculate@plt>
  add    $0x40,%rbx
  cmp    %rbp,%rbx
  jne    L102
L133:
  mov    %r13d,%r12d
  and    $0x3f,%r12d
  mov    %r12d,%r15d
  lea    0x10(%rsp),%rbx
  mov    %r15,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  mov    $0x40,%eax
  sub    %r12d,%eax
  add    %r15,%rbx
  mov    $0x0,%edi
  cmp    $0x8,%eax
  jae    L124
  test   $0x4,%al
  jne    L125
  test   %eax,%eax
  je     L129
  movb   $0x0,(%rbx)
  test   $0x2,%al
  je     L129
  mov    %eax,%eax
  movw   $0x0,-0x2(%rbx,%rax,1)
  jmp    L129
L87:
  mov    %rdi,%rbp
  jmp    L133
L125:
  movl   $0x0,(%rbx)
  mov    %eax,%eax
  movl   $0x0,-0x4(%rbx,%rax,1)
  jmp    L129
L124:
  movq   $0x0,(%rbx)
  mov    %eax,%edx
  movq   $0x0,-0x8(%rbx,%rdx,1)
  lea    0x8(%rbx),%rcx
  and    $0xfffffffffffffff8,%rcx
  sub    %rcx,%rbx
  add    %ebx,%eax
  and    $0xfffffff8,%eax
  cmp    $0x8,%eax
  jb     L129
  and    $0xfffffff8,%eax
  mov    $0x0,%edx
L148:
  mov    %edx,%esi
  mov    %rdi,(%rcx,%rsi,1)
  add    $0x8,%edx
  cmp    %eax,%edx
  jb     L148
L129:
  mov    %r12d,%eax
  orb    $0x80,0x10(%rsp,%rax,1)
  cmp    $0x37,%r12d
  ja     L56
L134:
  lea    0x0(,%r13,8),%eax
  mov    %eax,0x48(%rsp)
  cmp    $0x1fffffff,%r13d
  jbe    L63
  lea    0x8(,%r13,8),%eax
  mov    %eax,0x4c(%rsp)
L53:
  mov    %rsp,%rsi
  lea    0x8(%rsp),%rcx
  lea    0x4(%rsp),%rdx
  lea    0x10(%rsp),%rdi
  lea    0xc(%rsp),%r8
  mov    $0x0,%eax
  call   <MD5_Round_Calculate@plt>
  movdqa (%rsp),%xmm0
  movups %xmm0,(%r14)
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L146
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L56:
  mov    %rsp,%rsi
  lea    0x8(%rsp),%rcx
  lea    0x4(%rsp),%rdx
  lea    0x10(%rsp),%rdi
  lea    0xc(%rsp),%r8
  mov    $0x0,%eax
  call   <MD5_Round_Calculate@plt>
  movq   $0x0,0x10(%rsp)
  movq   $0x0,0x18(%rsp)
  movq   $0x0,0x20(%rsp)
  movq   $0x0,0x28(%rsp)
  movq   $0x0,0x30(%rsp)
  movq   $0x0,0x38(%rsp)
  movq   $0x0,0x40(%rsp)
  jmp    L134
L63:
  movl   $0x0,0x4c(%rsp)
  jmp    L53
L146:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void MD5_Binary(const char *string, int len, char *output) {
  unsigned char padding_message[64];
  unsigned char *pstring;
  unsigned int string_byte_len;
  unsigned int string_bit_len;
  unsigned int copy_len;
  unsigned int msg_digest[4];
  unsigned int *A = &msg_digest[0];
  unsigned int *B = &msg_digest[1];
  unsigned int *C = &msg_digest[2];
  unsigned int *D = &msg_digest[3];
  int i;
  *A = 0x67452301;
  *B = 0xefcdab89;
  *C = 0x98badcfe;
  *D = 0x10325476;
  string_byte_len = len;
  pstring = (unsigned char *)string;
  for (i = string_byte_len; 64 <= i; i -= 64, pstring += 64)
    MD5_Round_Calculate(pstring, A, B, C, D);
  copy_len = string_byte_len % 64;
  strncpy((char *)padding_message, (char *)pstring, copy_len);
  memset(padding_message + copy_len, 0, 64 - copy_len);
  padding_message[copy_len] |= 0x80;
  if (56 <= copy_len) {
    MD5_Round_Calculate(padding_message, A, B, C, D);
    memset(padding_message, 0, 56);
  }
  string_bit_len = string_byte_len * 8;
  memcpy(&padding_message[56], &string_bit_len, 4);
  if (4294967295U / 8 < string_byte_len) {
    unsigned int high = (string_byte_len - 4294967295U / 8) * 8;
    memcpy(&padding_message[60], &high, 4);
  } else {
    memset(&padding_message[60], 0, 4);
  }
  MD5_Round_Calculate(padding_message, A, B, C, D);
  memcpy(output, msg_digest, 16);
}
```