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

```asm
<bn_mul_words>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x100,%rsp
  mov    %rdi,-0xe8(%rbp)
  mov    %rsi,-0xf0(%rbp)
  mov    %edx,-0xf4(%rbp)
  mov    %rcx,-0x100(%rbp)
  movq   $0x0,-0xd8(%rbp)
  mov    -0xf4(%rbp),%eax
  not    %eax
  shr    $0x1f,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  cmpl   $0x0,-0xf4(%rbp)
  jg     L216
  mov    $0x0,%eax
  jmp    L106
L216:
  mov    -0x100(%rbp),%rax
  mov    %eax,%eax
  mov    %rax,-0x90(%rbp)
  mov    -0x100(%rbp),%rax
  shr    $0x20,%rax
  mov    %rax,-0x88(%rbp)
L159:
  mov    -0xf0(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0xd0(%rbp)
  mov    -0xd0(%rbp),%rax
  mov    %eax,%eax
  mov    %rax,-0x80(%rbp)
  shrq   $0x20,-0xd0(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  mov    -0xd0(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  mov    -0x88(%rbp),%rax
  imul   -0x78(%rbp),%rax
  mov    %rax,-0x70(%rbp)
  mov    -0x78(%rbp),%rax
  imul   -0x90(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  mov    -0x90(%rbp),%rax
  imul   -0xc8(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  mov    -0xc8(%rbp),%rax
  imul   -0x88(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  mov    -0x68(%rbp),%rax
  add    %rax,-0x70(%rbp)
  mov    -0x70(%rbp),%rax
  cmp    -0x68(%rbp),%rax
  jae    L186
  movabs $0x100000000,%rax
  add    %rax,-0xc8(%rbp)
L186:
  mov    -0x70(%rbp),%rax
  shr    $0x20,%rax
  add    %rax,-0xc8(%rbp)
  mov    -0x70(%rbp),%rax
  shl    $0x20,%rax
  mov    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rax
  add    %rax,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  cmp    -0x68(%rbp),%rax
  jae    L59
  addq   $0x1,-0xc8(%rbp)
L59:
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x80(%rbp)
  mov    -0xc8(%rbp),%rax
  mov    %rax,-0xd0(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L187
  addq   $0x1,-0xd0(%rbp)
L187:
  mov    -0xd0(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xe8(%rbp),%rax
  mov    -0x80(%rbp),%rdx
  mov    %rdx,(%rax)
  subl   $0x1,-0xf4(%rbp)
  cmpl   $0x0,-0xf4(%rbp)
  je     L50
  mov    -0xf0(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    %rax,-0xc0(%rbp)
  mov    -0xc0(%rbp),%rax
  mov    %eax,%eax
  mov    %rax,-0x60(%rbp)
  shrq   $0x20,-0xc0(%rbp)
  mov    -0x60(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  mov    -0xc0(%rbp),%rax
  mov    %rax,-0xb8(%rbp)
  mov    -0x88(%rbp),%rax
  imul   -0x58(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x58(%rbp),%rax
  imul   -0x90(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x90(%rbp),%rax
  imul   -0xb8(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0xb8(%rbp),%rax
  imul   -0x88(%rbp),%rax
  mov    %rax,-0xb8(%rbp)
  mov    -0x48(%rbp),%rax
  add    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  jae    L111
  movabs $0x100000000,%rax
  add    %rax,-0xb8(%rbp)
L111:
  mov    -0x50(%rbp),%rax
  shr    $0x20,%rax
  add    %rax,-0xb8(%rbp)
  mov    -0x50(%rbp),%rax
  shl    $0x20,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  add    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  jae    L3
  addq   $0x1,-0xb8(%rbp)
L3:
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  mov    -0xb8(%rbp),%rax
  mov    %rax,-0xc0(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x60(%rbp)
  mov    -0x60(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L84
  addq   $0x1,-0xc0(%rbp)
L84:
  mov    -0xc0(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xe8(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x60(%rbp),%rax
  mov    %rax,(%rdx)
  subl   $0x1,-0xf4(%rbp)
  cmpl   $0x0,-0xf4(%rbp)
  je     L18
  mov    -0xf0(%rbp),%rax
  mov    0x10(%rax),%rax
  mov    %rax,-0xb0(%rbp)
  mov    -0xb0(%rbp),%rax
  mov    %eax,%eax
  mov    %rax,-0x40(%rbp)
  shrq   $0x20,-0xb0(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0xb0(%rbp),%rax
  mov    %rax,-0xa8(%rbp)
  mov    -0x88(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x38(%rbp),%rax
  imul   -0x90(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x90(%rbp),%rax
  imul   -0xa8(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0xa8(%rbp),%rax
  imul   -0x88(%rbp),%rax
  mov    %rax,-0xa8(%rbp)
  mov    -0x28(%rbp),%rax
  add    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jae    L63
  movabs $0x100000000,%rax
  add    %rax,-0xa8(%rbp)
L63:
  mov    -0x30(%rbp),%rax
  shr    $0x20,%rax
  add    %rax,-0xa8(%rbp)
  mov    -0x30(%rbp),%rax
  shl    $0x20,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  add    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jae    L167
  addq   $0x1,-0xa8(%rbp)
L167:
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0xa8(%rbp),%rax
  mov    %rax,-0xb0(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L110
  addq   $0x1,-0xb0(%rbp)
L110:
  mov    -0xb0(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xe8(%rbp),%rax
  lea    0x10(%rax),%rdx
  mov    -0x40(%rbp),%rax
  mov    %rax,(%rdx)
  subl   $0x1,-0xf4(%rbp)
  cmpl   $0x0,-0xf4(%rbp)
  je     L161
  mov    -0xf0(%rbp),%rax
  mov    0x18(%rax),%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %eax,%eax
  mov    %rax,-0x20(%rbp)
  shrq   $0x20,-0xa0(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x88(%rbp),%rax
  imul   -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  imul   -0x90(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x90(%rbp),%rax
  imul   -0x98(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x98(%rbp),%rax
  imul   -0x88(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x8(%rbp),%rax
  add    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jae    L182
  movabs $0x100000000,%rax
  add    %rax,-0x98(%rbp)
L182:
  mov    -0x10(%rbp),%rax
  shr    $0x20,%rax
  add    %rax,-0x98(%rbp)
  mov    -0x10(%rbp),%rax
  shl    $0x20,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  add    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jae    L153
  addq   $0x1,-0x98(%rbp)
L153:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x98(%rbp),%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L36
  addq   $0x1,-0xa0(%rbp)
L36:
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xe8(%rbp),%rax
  lea    0x18(%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rax,(%rdx)
  subl   $0x1,-0xf4(%rbp)
  cmpl   $0x0,-0xf4(%rbp)
  je     L115
  addq   $0x20,-0xf0(%rbp)
  addq   $0x20,-0xe8(%rbp)
  jmp    L159
L50:
  nop
  jmp    L210
L18:
  nop
  jmp    L210
L161:
  nop
  jmp    L210
L115:
  nop
L210:
  mov    -0xd8(%rbp),%rax
L106:
  leave
  ret
```

assistant: ```c
unsigned long long bn_mul_words(unsigned long long *rp, unsigned long long *ap, int num, unsigned long long w) {
  unsigned long long carry = 0;
  unsigned long long bl, bh;
  assert(num >= 0);
  if (num <= 0)
    return ((unsigned long long)0);
  bl = ((w) & (0xffffffffL));
  bh = (((w) >> 32) & (0xffffffffL));
  for (;;) {
    {
      unsigned long long l, h;
      h = (ap[0]);
      l = ((h) & (0xffffffffL));
      h = (((h) >> 32) & (0xffffffffL));
      {
        unsigned long long m, m1, lt, ht;
        lt = l;
        ht = h;
        m = ((bh)) * (lt);
        lt = ((bl)) * (lt);
        m1 = ((bl)) * (ht);
        ht = ((bh)) * (ht);
        m = (m + m1) & (0xffffffffffffffffLL);
        if (m < m1)
          ht += ((unsigned long long)((1L) & (0xffffffffL)) << 32);
        ht += (((m) >> 32) & (0xffffffffL));
        m1 = ((unsigned long long)((m) & (0xffffffffL)) << 32);
        lt = (lt + m1) & (0xffffffffffffffffLL);
        if (lt < m1)
          ht++;
        (l) = lt;
        (h) = ht;
      };
      l += (carry);
      if ((l & (0xffffffffffffffffLL)) < (carry))
        h++;
      (carry) = h & (0xffffffffffffffffLL);
      (rp[0]) = l & (0xffffffffffffffffLL);
    };
    if (--num == 0)
      break;
    {
      unsigned long long l, h;
      h = (ap[1]);
      l = ((h) & (0xffffffffL));
      h = (((h) >> 32) & (0xffffffffL));
      {
        unsigned long long m, m1, lt, ht;
        lt = l;
        ht = h;
        m = ((bh)) * (lt);
        lt = ((bl)) * (lt);
        m1 = ((bl)) * (ht);
        ht = ((bh)) * (ht);
        m = (m + m1) & (0xffffffffffffffffLL);
        if (m < m1)
          ht += ((unsigned long long)((1L) & (0xffffffffL)) << 32);
        ht += (((m) >> 32) & (0xffffffffL));
        m1 = ((unsigned long long)((m) & (0xffffffffL)) << 32);
        lt = (lt + m1) & (0xffffffffffffffffLL);
        if (lt < m1)
          ht++;
        (l) = lt;
        (h) = ht;
      };
      l += (carry);
      if ((l & (0xffffffffffffffffLL)) < (carry))
        h++;
      (carry) = h & (0xffffffffffffffffLL);
      (rp[1]) = l & (0xffffffffffffffffLL);
    };
    if (--num == 0)
      break;
    {
      unsigned long long l, h;
      h = (ap[2]);
      l = ((h) & (0xffffffffL));
      h = (((h) >> 32) & (0xffffffffL));
      {
        unsigned long long m, m1, lt, ht;
        lt = l;
        ht = h;
        m = ((bh)) * (lt);
        lt = ((bl)) * (lt);
        m1 = ((bl)) * (ht);
        ht = ((bh)) * (ht);
        m = (m + m1) & (0xffffffffffffffffLL);
        if (m < m1)
          ht += ((unsigned long long)((1L) & (0xffffffffL)) << 32);
        ht += (((m) >> 32) & (0xffffffffL));
        m1 = ((unsigned long long)((m) & (0xffffffffL)) << 32);
        lt = (lt + m1) & (0xffffffffffffffffLL);
        if (lt < m1)
          ht++;
        (l) = lt;
        (h) = ht;
      };
      l += (carry);
      if ((l & (0xffffffffffffffffLL)) < (carry))
        h++;
      (carry) = h & (0xffffffffffffffffLL);
      (rp[2]) = l & (0xffffffffffffffffLL);
    };
    if (--num == 0)
      break;
    {
      unsigned long long l, h;
      h = (ap[3]);
      l = ((h) & (0xffffffffL));
      h = (((h) >> 32) & (0xffffffffL));
      {
        unsigned long long m, m1, lt, ht;
        lt = l;
        ht = h;
        m = ((bh)) * (lt);
        lt = ((bl)) * (lt);
        m1 = ((bl)) * (ht);
        ht = ((bh)) * (ht);
        m = (m + m1) & (0xffffffffffffffffLL);
        if (m < m1)
          ht += ((unsigned long long)((1L) & (0xffffffffL)) << 32);
        ht += (((m) >> 32) & (0xffffffffL));
        m1 = ((unsigned long long)((m) & (0xffffffffL)) << 32);
        lt = (lt + m1) & (0xffffffffffffffffLL);
        if (lt < m1)
          ht++;
        (l) = lt;
        (h) = ht;
      };
      l += (carry);
      if ((l & (0xffffffffffffffffLL)) < (carry))
        h++;
      (carry) = h & (0xffffffffffffffffLL);
      (rp[3]) = l & (0xffffffffffffffffLL);
    };
    if (--num == 0)
      break;
    ap += 4;
    rp += 4;
  }
  return (carry);
}
```