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

```asm
<sha1_process_part1>:
  endbr64
  mov    %rdi,%r9
  push   %rbx
  mov    %rsi,%r10
  mov    (%rdx),%eax
  mov    %rdx,%rsi
  mov    %ecx,%edi
  lea    0x40(%r9),%r11
  mov    %r9,%rdx
  nopl   0x0(%rax)
L96:
  mov    (%rdx),%ecx
  cmp    %eax,%edi
  jle    L45
  cltq
  movsbl (%r10,%rax,1),%eax
  shl    $0x18,%eax
  add    %ecx,%eax
  mov    %eax,(%rdx)
  mov    (%rsi),%eax
  add    $0x1,%eax
  mov    %eax,(%rsi)
  cmp    %eax,%edi
  jle    L39
  cltq
  movsbl (%r10,%rax,1),%eax
  shl    $0x10,%eax
  add    %eax,(%rdx)
  mov    (%rsi),%eax
  add    $0x1,%eax
  mov    %eax,(%rsi)
  cmp    %eax,%edi
  jle    L93
  cltq
  movsbl (%r10,%rax,1),%eax
  shl    $0x8,%eax
  add    %eax,(%rdx)
  mov    (%rsi),%eax
  add    $0x1,%eax
  mov    %eax,(%rsi)
  cmp    %eax,%edi
  jle    L56
  cltq
  movsbl (%r10,%rax,1),%eax
  add    %eax,(%rdx)
  mov    (%rsi),%eax
  add    $0x1,%eax
  mov    %eax,(%rsi)
L109:
  add    $0x4,%rdx
  cmp    %r11,%rdx
  jne    L96
  movq   0x18(%r9),%xmm4
  movq   0x10(%r9),%xmm3
  mov    $0x4,%eax
  movq   0x8(%r9),%xmm1
L86:
  movq   -0x20(%rdx),%xmm2
  add    $0x4,%eax
  lea    0x14(%rdx),%rsi
  mov    %rdx,%rcx
  movq   -0xc(%rdx),%xmm0
  movq   -0x40(%rdx),%xmm5
  lea    -0x18(%rdx),%rdi
  lea    -0x20(%rdx),%r8
  add    $0x20,%rdx
  pxor   %xmm1,%xmm5
  pxor   %xmm2,%xmm0
  pxor   %xmm5,%xmm0
  movq   -0x58(%rdx),%xmm5
  movdqa %xmm0,%xmm1
  pslld  $0x1,%xmm0
  psrad  $0x1f,%xmm1
  pxor   %xmm3,%xmm5
  por    %xmm1,%xmm0
  movq   -0x38(%rdx),%xmm1
  movq   %xmm0,-0x20(%rdx)
  movq   -0x24(%rdx),%xmm0
  pxor   %xmm1,%xmm0
  pxor   %xmm5,%xmm0
  movq   -0x48(%rdx),%xmm5
  movdqa %xmm0,%xmm3
  pslld  $0x1,%xmm0
  psrad  $0x1f,%xmm3
  pxor   %xmm2,%xmm5
  por    %xmm3,%xmm0
  movq   -0x30(%rdx),%xmm3
  movq   %xmm0,-0x18(%rdx)
  movq   -0x50(%rdx),%xmm0
  pxor   %xmm4,%xmm0
  movq   -0x1c(%rdx),%xmm4
  pxor   %xmm3,%xmm4
  pxor   %xmm4,%xmm0
  movdqa %xmm0,%xmm4
  pslld  $0x1,%xmm0
  psrad  $0x1f,%xmm4
  por    %xmm4,%xmm0
  movq   -0x28(%rdx),%xmm4
  movq   %xmm0,-0x10(%rdx)
  movq   -0x14(%rdx),%xmm0
  pxor   %xmm4,%xmm0
  pxor   %xmm5,%xmm0
  movdqa %xmm0,%xmm2
  pslld  $0x1,%xmm0
  psrad  $0x1f,%xmm2
  por    %xmm2,%xmm0
  movq   %xmm0,-0x8(%rdx)
  cmp    $0x20,%eax
  jne    L86
  xor    %eax,%eax
  cs nopw 0x0(%rax,%rax,1)
L117:
  movq   (%rcx,%rax,8),%xmm1
  movq   (%rsi,%rax,8),%xmm0
  movq   (%r8,%rax,8),%xmm2
  pxor   %xmm1,%xmm0
  movq   (%rdi,%rax,8),%xmm1
  pxor   %xmm2,%xmm1
  pxor   %xmm1,%xmm0
  movdqa %xmm0,%xmm1
  psrad  $0x1f,%xmm0
  pslld  $0x1,%xmm1
  por    %xmm1,%xmm0
  movq   %xmm0,(%rdx,%rax,8)
  add    $0x1,%rax
  cmp    $0x4,%eax
  jne    L117
  pop    %rbx
  ret
  nopl   0x0(%rax,%rax,1)
L45:
  mov    $0x18,%ebx
L50:
  sub    %edi,%eax
  mov    %ebx,%ecx
  cltq
  movzbl (%r8,%rax,1),%eax
  shl    %cl,%eax
  add    %eax,(%rdx)
  mov    (%rsi),%eax
  lea    -0x8(%rbx),%ecx
  add    $0x1,%eax
  mov    %eax,(%rsi)
  sub    %edi,%eax
  cltq
  movzbl (%r8,%rax,1),%eax
  shl    %cl,%eax
  add    %eax,(%rdx)
  mov    (%rsi),%eax
  add    $0x1,%eax
  mov    %eax,(%rsi)
  sub    $0x10,%ebx
  js     L109
  sub    %edi,%eax
  mov    %ebx,%ecx
  cltq
  movzbl (%r8,%rax,1),%eax
  shl    %cl,%eax
  add    %eax,(%rdx)
  mov    (%rsi),%eax
  add    $0x1,%eax
  mov    %eax,(%rsi)
  cmp    $0x8,%ebx
  jne    L109
L56:
  sub    %edi,%eax
  cltq
  movzbl (%r8,%rax,1),%eax
  add    %eax,(%rdx)
  mov    (%rsi),%eax
  add    $0x1,%eax
  mov    %eax,(%rsi)
  jmp    L109
  nopl   0x0(%rax)
L39:
  mov    $0x10,%ebx
  jmp    L50
L93:
  mov    $0x8,%ebx
  jmp    L50
```

assistant: ```c
void sha1_process_part1(uint32_t *w, const char *message, uint32_t *pos, uint32_t mes_len, const unsigned char *mes_bkp) {
  uint32_t i;
  for (i = 0; i <= 15; i++) {
    int32_t count = 24;
    while (*pos < mes_len && count >= 0) {
      w[i] += (((uint32_t)message[*pos]) << count);
      (*pos)++;
      count -= 8;
    }
    while (count >= 0) {
      w[i] += (((uint32_t)mes_bkp[*pos - mes_len]) << count);
      (*pos)++;
      count -= 8;
    }
  }
  for (i = 16; i <= 79; i++) {
    w[i] = ((((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16])) << (1)) | (((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16])) >> (32 - (1))));
  }
}
```