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

```asm
<bn_mul_add_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     L28
  mov    $0x0,%eax
  jmp    L175
L28:
  mov    -0x100(%rbp),%rax
  mov    %eax,%eax
  mov    %rax,-0x90(%rbp)
  mov    -0x100(%rbp),%rax
  shr    $0x20,%rax
  mov    %rax,-0x88(%rbp)
L10:
  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    L104
  movabs $0x100000000,%rax
  add    %rax,-0xc8(%rbp)
L104:
  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    L40
  addq   $0x1,-0xc8(%rbp)
L40:
  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    L164
  addq   $0x1,-0xd0(%rbp)
L164:
  mov    -0xe8(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L145
  addq   $0x1,-0xd0(%rbp)
L145:
  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     L141
  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    L108
  movabs $0x100000000,%rax
  add    %rax,-0xb8(%rbp)
L108:
  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    L45
  addq   $0x1,-0xb8(%rbp)
L45:
  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    L168
  addq   $0x1,-0xc0(%rbp)
L168:
  mov    -0xe8(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x60(%rbp)
  mov    -0x60(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L150
  addq   $0x1,-0xc0(%rbp)
L150:
  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     L56
  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    L29
  movabs $0x100000000,%rax
  add    %rax,-0xa8(%rbp)
L29:
  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    L15
  addq   $0x1,-0xa8(%rbp)
L15:
  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    L201
  addq   $0x1,-0xb0(%rbp)
L201:
  mov    -0xe8(%rbp),%rax
  mov    0x10(%rax),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L42
  addq   $0x1,-0xb0(%rbp)
L42:
  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     L30
  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    L131
  addq   $0x1,-0x98(%rbp)
L131:
  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    L11
  addq   $0x1,-0xa0(%rbp)
L11:
  mov    -0xe8(%rbp),%rax
  mov    0x18(%rax),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xd8(%rbp),%rax
  add    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L1
  addq   $0x1,-0xa0(%rbp)
L1:
  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     L17
  addq   $0x20,-0xf0(%rbp)
  addq   $0x20,-0xe8(%rbp)
  jmp    L10
L141:
  nop
  jmp    L25
L56:
  nop
  jmp    L25
L30:
  nop
  jmp    L25
L17:
  nop
L25:
  mov    -0xd8(%rbp),%rax
L175:
  leave
  ret
```

assistant: ```c
unsigned long long bn_mul_add_words(unsigned long long *rp, unsigned long long *ap, int num, unsigned long long w) {
  unsigned long long c = 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 = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = (rp[0]);
      l = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = h & (0xffffffffffffffffLL);
      (rp[0]) = l;
    };
    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 = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = (rp[1]);
      l = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = h & (0xffffffffffffffffLL);
      (rp[1]) = l;
    };
    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 = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = (rp[2]);
      l = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = h & (0xffffffffffffffffLL);
      (rp[2]) = l;
    };
    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 = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = (rp[3]);
      l = (l + (c)) & (0xffffffffffffffffLL);
      if (l < (c))
        h++;
      (c) = h & (0xffffffffffffffffLL);
      (rp[3]) = l;
    };
    if (--num == 0)
      break;
    ap += 4;
    rp += 4;
  }
  return (c);
}
```