user: 请从给定的汇编指令推导出C源代码:

```asm
<MD4_Update>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r12
  push   %rbx
  sub    $0x40,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x48(%rbp)
  jne    L14
  mov    $0x1,%eax
  jmp    L30
L14:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x48(%rbp),%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  mov    %eax,%ebx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,%rbx
  jae    L292
  mov    -0x38(%rbp),%rax
  mov    0x18(%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,0x18(%rax)
L292:
  mov    -0x38(%rbp),%rax
  mov    0x18(%rax),%rax
  mov    %rax,%rdx
  mov    -0x48(%rbp),%rax
  shr    $0x1d,%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,0x18(%rax)
  mov    -0x38(%rbp),%rax
  mov    %rbx,(%rax)
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  test   %eax,%eax
  je     L420
  mov    -0x38(%rbp),%rax
  mov    0x10(%rax),%r12
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  sar    $0x2,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  and    $0x3,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    D10(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  jb     L454
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    (%rax),%rbx
  cmpl   $0x3,-0x20(%rbp)
  je     L503
  cmpl   $0x3,-0x20(%rbp)
  jg     L474
  cmpl   $0x2,-0x20(%rbp)
  je     L265
  cmpl   $0x2,-0x20(%rbp)
  jg     L474
  cmpl   $0x0,-0x20(%rbp)
  je     L74
  cmpl   $0x1,-0x20(%rbp)
  je     L60
  jmp    L474
L74:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%ebx
L60:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
L265:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  or     %rax,%rbx
L503:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%rax
  or     %rax,%rbx
L474:
  mov    -0x28(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x28(%rbp)
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    %rbx,(%rax)
  jmp    L234
L101:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%ebx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  or     %rax,%rbx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%rax
  or     %rax,%rbx
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    %rbx,(%rax)
  addl   $0x1,-0x28(%rbp)
L234:
  mov    D30(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x28(%rbp)
  jl     L101
  mov    -0x38(%rbp),%rax
  mov    $0x1,%edx
  mov    %r12,%rsi
  mov    %rax,%rdi
  call   <md4_block_host_order@plt>
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  movslq %eax,%rdx
  mov    D10(%rip),%rax
  mov    (%rax),%rcx
  mov    %rdx,%rax
  sub    %rcx,%rax
  add    %rax,-0x48(%rbp)
  mov    -0x38(%rbp),%rax
  movl   $0x0,0x8(%rax)
  jmp    L420
L454:
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  mov    %eax,%edx
  mov    -0x48(%rbp),%rax
  add    %edx,%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,0x8(%rax)
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  cmp    $0x3,%rax
  ja     L90
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    (%rax),%rbx
  cmpl   $0x2,-0x20(%rbp)
  je     L511
  cmpl   $0x2,-0x20(%rbp)
  jg     L176
  cmpl   $0x0,-0x20(%rbp)
  je     L260
  cmpl   $0x1,-0x20(%rbp)
  je     L513
  jmp    L176
L260:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%ebx
  subq   $0x1,-0x48(%rbp)
  cmpq   $0x0,-0x48(%rbp)
  je     L87
L513:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
  subq   $0x1,-0x48(%rbp)
  cmpq   $0x0,-0x48(%rbp)
  je     L202
L511:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  or     %rax,%rbx
  jmp    L176
L87:
  nop
  jmp    L176
L202:
  nop
L176:
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    %rbx,(%rax)
  jmp    L72
L90:
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  sar    $0x2,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  and    $0x3,%eax
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  je     L462
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    (%rax),%rbx
L462:
  cmpl   $0x3,-0x20(%rbp)
  je     L380
  cmpl   $0x3,-0x20(%rbp)
  jg     L203
  cmpl   $0x2,-0x20(%rbp)
  je     L175
  cmpl   $0x2,-0x20(%rbp)
  jg     L203
  cmpl   $0x0,-0x20(%rbp)
  je     L12
  cmpl   $0x1,-0x20(%rbp)
  je     L77
  jmp    L203
L12:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%ebx
L77:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
L175:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  or     %rax,%rbx
L380:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%rax
  or     %rax,%rbx
L203:
  mov    -0x28(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x28(%rbp)
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    %rbx,(%rax)
  jmp    L219
L54:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%ebx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  or     %rax,%rbx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%rax
  or     %rax,%rbx
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    %rbx,(%rax)
  addl   $0x1,-0x28(%rbp)
L219:
  mov    -0x28(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L54
  cmpl   $0x0,-0x1c(%rbp)
  je     L72
  mov    $0x0,%ebx
  mov    -0x1c(%rbp),%eax
  cltq
  add    %rax,-0x18(%rbp)
  cmpl   $0x3,-0x1c(%rbp)
  je     L306
  cmpl   $0x3,-0x1c(%rbp)
  jg     L430
  cmpl   $0x1,-0x1c(%rbp)
  je     L258
  cmpl   $0x2,-0x1c(%rbp)
  je     L329
  jmp    L430
L306:
  subq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  mov    %rax,%rbx
L329:
  subq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
L258:
  subq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %rax,%rbx
L430:
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %r12,%rax
  mov    %rbx,(%rax)
L72:
  mov    $0x1,%eax
  jmp    L30
L420:
  mov    D10(%rip),%rax
  mov    (%rax),%rsi
  mov    -0x48(%rbp),%rax
  mov    $0x0,%edx
  div    %rsi
  mov    %eax,-0x28(%rbp)
  cmpl   $0x0,-0x28(%rbp)
  jle    L182
  mov    -0x28(%rbp),%edx
  mov    -0x18(%rbp),%rcx
  mov    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <md4_block_data_order@plt>
  mov    -0x28(%rbp),%eax
  cltq
  mov    %eax,%edx
  mov    D10(%rip),%rax
  mov    (%rax),%rax
  imul   %edx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  cltq
  add    %rax,-0x18(%rbp)
  mov    -0x28(%rbp),%eax
  cltq
  sub    %rax,-0x48(%rbp)
L182:
  cmpq   $0x0,-0x48(%rbp)
  je     L155
  mov    -0x38(%rbp),%rax
  mov    0x10(%rax),%r12
  mov    -0x48(%rbp),%rax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,0x8(%rax)
  mov    -0x48(%rbp),%rax
  shr    $0x2,%rax
  mov    %eax,-0x24(%rbp)
  mov    -0x48(%rbp),%rax
  and    $0x3,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L8
L172:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%ebx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  or     %rax,%rbx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%rax
  or     %rax,%rbx
  mov    %rbx,(%r12)
  subl   $0x1,-0x24(%rbp)
  add    $0x8,%r12
L8:
  cmpl   $0x0,-0x24(%rbp)
  jne    L172
  mov    $0x0,%ebx
  mov    -0x1c(%rbp),%eax
  cltq
  add    %rax,-0x18(%rbp)
  cmpl   $0x3,-0x1c(%rbp)
  je     L278
  cmpl   $0x3,-0x1c(%rbp)
  jg     L330
  cmpl   $0x1,-0x1c(%rbp)
  je     L103
  cmpl   $0x2,-0x1c(%rbp)
  je     L267
  jmp    L330
L278:
  subq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%rax
  mov    %rax,%rbx
L267:
  subq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%rax
  or     %rax,%rbx
L103:
  subq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %rax,%rbx
L330:
  mov    %rbx,(%r12)
L155:
  mov    $0x1,%eax
L30:
  add    $0x40,%rsp
  pop    %rbx
  pop    %r12
  pop    %rbp
  ret
```

assistant: ```c
int MD4_Update(MD4_CTX *c, const void *data_, unsigned long len) {
  const unsigned char *data = data_;
  register MD4_LONG *p;
  register unsigned long l;
  int sw, sc, ew, ec;
  if (len == 0)
    return 1;
  l = (c->Nl + (len << 3)) & 0xffffffffL;
  if (l < c->Nl)
    c->Nh++;
  c->Nh += (len >> 29);
  c->Nl = l;
  if (c->num != 0) {
    p = c->data;
    sw = c->num >> 2;
    sc = c->num & 0x03;
    if ((c->num + len) >= MD4_CBLOCK) {
      l = p[sw];
      {
        switch (sc) {
        case 0:
          l = ((unsigned long)(*((data)++)));
        case 1:
          l |= ((unsigned long)(*((data)++))) << 8;
        case 2:
          l |= ((unsigned long)(*((data)++))) << 16;
        case 3:
          l |= ((unsigned long)(*((data)++))) << 24;
        }
      };
      p[sw++] = l;
      for (; sw < MD4_LBLOCK; sw++) {
        (l = (((unsigned long)(*((data)++)))), l |= (((unsigned long)(*((data)++))) << 8), l |= (((unsigned long)(*((data)++))) << 16), l |= (((unsigned long)(*((data)++))) << 24), l);
        p[sw] = l;
      }
      md4_block_host_order(c, p, 1);
      len -= (MD4_CBLOCK - c->num);
      c->num = 0;
    } else {
      c->num += len;
      if ((sc + len) < 4) {
        l = p[sw];
        {
          switch (sc) {
          case 0:
            l = ((unsigned long)(*((data)++)));
            if (--len == 0)
              break;
          case 1:
            l |= ((unsigned long)(*((data)++))) << 8;
            if (--len == 0)
              break;
          case 2:
            l |= ((unsigned long)(*((data)++))) << 16;
          }
        };
        p[sw] = l;
      } else {
        ew = (c->num >> 2);
        ec = (c->num & 0x03);
        if (sc)
          l = p[sw];
        {
          switch (sc) {
          case 0:
            l = ((unsigned long)(*((data)++)));
          case 1:
            l |= ((unsigned long)(*((data)++))) << 8;
          case 2:
            l |= ((unsigned long)(*((data)++))) << 16;
          case 3:
            l |= ((unsigned long)(*((data)++))) << 24;
          }
        };
        p[sw++] = l;
        for (; sw < ew; sw++) {
          (l = (((unsigned long)(*((data)++)))), l |= (((unsigned long)(*((data)++))) << 8), l |= (((unsigned long)(*((data)++))) << 16), l |= (((unsigned long)(*((data)++))) << 24), l);
          p[sw] = l;
        }
        if (ec) {
          {
            l = 0;
            (data) += ec;
            switch (ec) {
            case 3:
              l = ((unsigned long)(*(--(data)))) << 16;
            case 2:
              l |= ((unsigned long)(*(--(data)))) << 8;
            case 1:
              l |= ((unsigned long)(*(--(data))));
            }
          };
          p[sw] = l;
        }
      }
      return 1;
    }
  }
  sw = len / MD4_CBLOCK;
  if (sw > 0) {
    {
      md4_block_data_order(c, data, sw);
      sw *= MD4_CBLOCK;
      data += sw;
      len -= sw;
    }
  }
  if (len != 0) {
    p = c->data;
    c->num = len;
    ew = len >> 2;
    ec = len & 0x03;
    for (; ew; ew--, p++) {
      (l = (((unsigned long)(*((data)++)))), l |= (((unsigned long)(*((data)++))) << 8), l |= (((unsigned long)(*((data)++))) << 16), l |= (((unsigned long)(*((data)++))) << 24), l);
      *p = l;
    }
    {
      l = 0;
      (data) += ec;
      switch (ec) {
      case 3:
        l = ((unsigned long)(*(--(data)))) << 16;
      case 2:
        l |= ((unsigned long)(*(--(data)))) << 8;
      case 1:
        l |= ((unsigned long)(*(--(data))));
      }
    };
    *p = l;
  }
  return 1;
}
```