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

```asm
<padMsg>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x2c(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x37,-0x14(%rbp)
  jle    L43
  mov    $0x2,%eax
  jmp    L50
L43:
  mov    $0x1,%eax
L50:
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  sub    $0x9,%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x2c(%rbp),%eax
  and    $0xffffffc0,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L55
L17:
  mov    -0x8(%rbp),%rdx
  lea    0x8(%rdx),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    %rcx,-0x38(%rbp)
  mov    (%rdx),%rdx
  mov    %rdx,(%rax)
L55:
  mov    -0x14(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x14(%rbp)
  test   %eax,%eax
  jne    L17
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  movq   $0x80,(%rax)
  jmp    L18
L11:
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  movq   $0x0,(%rax)
L18:
  mov    -0x10(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x10(%rbp)
  test   %eax,%eax
  jne    L11
  shll   $0x3,-0x2c(%rbp)
  mov    $0x38,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    $0x30,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    $0x28,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    $0x20,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x2c(%rbp),%eax
  sar    $0x18,%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x2c(%rbp),%eax
  sar    $0x10,%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x2c(%rbp),%eax
  sar    $0x8,%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x2c(%rbp),%eax
  cltq
  movzbl %al,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0xc(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
int padMsg(const void *msg, uint64_t bytes, uint8_t *lastBlock) {
  int msgBytesInLast = (int)(bytes & 63);
  int extraBlocks = (msgBytesInLast + 9) > 64 ? 2 : 1;
  int numZeroBytes = extraBlocks * 64 - 9 - msgBytesInLast;
  const uint8_t *msgLast = (uint8_t *)msg + (bytes & ~63);
  while (msgBytesInLast--)
    *lastBlock++ = *msgLast++;
  *lastBlock++ = 0x80;
  while (numZeroBytes--)
    *lastBlock++ = 0;
  bytes *= 8;
  *lastBlock++ = (uint8_t)(bytes >> 56 & 0xff);
  *lastBlock++ = (uint8_t)(bytes >> 48 & 0xff);
  *lastBlock++ = (uint8_t)(bytes >> 40 & 0xff);
  *lastBlock++ = (uint8_t)(bytes >> 32 & 0xff);
  *lastBlock++ = (uint8_t)(bytes >> 24 & 0xff);
  *lastBlock++ = (uint8_t)(bytes >> 16 & 0xff);
  *lastBlock++ = (uint8_t)(bytes >> 8 & 0xff);
  *lastBlock++ = (uint8_t)(bytes >> 0 & 0xff);
  return extraBlocks;
}
```