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

```asm
<MD5_Binary>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc0,%rsp
  mov    %rdi,-0xa8(%rbp)
  mov    %esi,-0xac(%rbp)
  mov    %rdx,-0xb8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x60(%rbp),%rax
  mov    %rax,-0x80(%rbp)
  lea    -0x60(%rbp),%rax
  add    $0x4,%rax
  mov    %rax,-0x78(%rbp)
  lea    -0x60(%rbp),%rax
  add    $0x8,%rax
  mov    %rax,-0x70(%rbp)
  lea    -0x60(%rbp),%rax
  add    $0xc,%rax
  mov    %rax,-0x68(%rbp)
  mov    -0x80(%rbp),%rax
  movl   $0x67452301,(%rax)
  mov    -0x78(%rbp),%rax
  movl   $0xefcdab89,(%rax)
  mov    -0x70(%rbp),%rax
  movl   $0x98badcfe,(%rax)
  mov    -0x68(%rbp),%rax
  movl   $0x10325476,(%rax)
  mov    -0xac(%rbp),%eax
  mov    %eax,-0x90(%rbp)
  mov    -0xa8(%rbp),%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x90(%rbp),%eax
  mov    %eax,-0x94(%rbp)
  jmp    L36
L2:
  mov    -0x68(%rbp),%rdi
  mov    -0x70(%rbp),%rcx
  mov    -0x78(%rbp),%rdx
  mov    -0x80(%rbp),%rsi
  mov    -0x88(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <MD5_Round_Calculate@plt>
  subl   $0x40,-0x94(%rbp)
  addq   $0x40,-0x88(%rbp)
L36:
  cmpl   $0x3f,-0x94(%rbp)
  jg     L2
  mov    -0x90(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,-0x8c(%rbp)
  mov    -0x8c(%rbp),%edx
  mov    -0x88(%rbp),%rcx
  lea    -0x50(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    $0x40,%eax
  sub    -0x8c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  lea    -0x50(%rbp),%rcx
  add    %rcx,%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x8c(%rbp),%eax
  movzbl -0x50(%rbp,%rax,1),%eax
  or     $0xffffff80,%eax
  mov    %eax,%edx
  mov    -0x8c(%rbp),%eax
  mov    %dl,-0x50(%rbp,%rax,1)
  cmpl   $0x37,-0x8c(%rbp)
  jbe    L33
  mov    -0x68(%rbp),%rdi
  mov    -0x70(%rbp),%rcx
  mov    -0x78(%rbp),%rdx
  mov    -0x80(%rbp),%rsi
  lea    -0x50(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <MD5_Round_Calculate@plt>
  lea    -0x50(%rbp),%rax
  mov    $0x38,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
L33:
  mov    -0x90(%rbp),%eax
  shl    $0x3,%eax
  mov    %eax,-0x9c(%rbp)
  mov    -0x9c(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  cmpl   $0x1fffffff,-0x90(%rbp)
  jbe    L18
  mov    -0x90(%rbp),%eax
  sub    $0x1fffffff,%eax
  shl    $0x3,%eax
  mov    %eax,-0x98(%rbp)
  mov    -0x98(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  jmp    L41
L18:
  lea    -0x50(%rbp),%rax
  add    $0x3c,%rax
  mov    $0x4,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
L41:
  mov    -0x68(%rbp),%rdi
  mov    -0x70(%rbp),%rcx
  mov    -0x78(%rbp),%rdx
  mov    -0x80(%rbp),%rsi
  lea    -0x50(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <MD5_Round_Calculate@plt>
  mov    -0x60(%rbp),%rax
  mov    -0x58(%rbp),%rdx
  mov    -0xb8(%rbp),%rcx
  mov    %rax,(%rcx)
  mov    %rdx,0x8(%rcx)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L55
  call   <__stack_chk_fail@plt>
L55:
  leave
  ret
```

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);
}
```