user: 请将以下的汇编代码转换成C语言代码:

```asm
<add_internal>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %r8,%r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x18,%rsp
  mov    (%rdi),%edi
  mov    (%rsi),%eax
  xor    %esi,%esi
  mov    %rdx,(%rsp)
  mov    %rcx,0x8(%rsp)
  mov    %eax,%edx
  mov    %edi,%ecx
  mov    %eax,%r8d
  and    $0x1,%ecx
  and    $0x1,%edx
  mov    %edi,%r10d
  add    %ecx,%edx
  mov    %edi,%ecx
  cmp    $0x1,%edx
  seta   %sil
  shr    %r8d
  xor    %eax,%r10d
  shr    %ecx
  mov    %r8d,%edx
  and    $0x1,%r8d
  and    $0x1,%r10d
  xor    %ecx,%edx
  and    $0x1,%ecx
  and    $0x1,%edx
  add    %r8d,%ecx
  xor    %r8d,%r8d
  xor    %esi,%edx
  add    %esi,%ecx
  mov    %edi,%esi
  add    %edx,%edx
  or     %r10d,%edx
  cmp    $0x1,%ecx
  mov    %eax,%r10d
  seta   %r8b
  shr    $0x2,%esi
  shr    $0x2,%r10d
  mov    %esi,%ecx
  and    $0x1,%esi
  xor    %r10d,%ecx
  and    $0x1,%r10d
  and    $0x1,%ecx
  xor    %r8d,%ecx
  shl    $0x2,%ecx
  or     %edx,%ecx
  lea    (%rsi,%r10,1),%edx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%edx
  xor    %r8d,%r8d
  cmp    $0x1,%edx
  seta   %r8b
  shr    $0x3,%esi
  shr    $0x3,%r10d
  mov    %esi,%edx
  and    $0x1,%esi
  xor    %r10d,%edx
  and    $0x1,%r10d
  and    $0x1,%edx
  xor    %r8d,%edx
  shl    $0x3,%edx
  or     %ecx,%edx
  lea    (%rsi,%r10,1),%ecx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%ecx
  xor    %r8d,%r8d
  cmp    $0x1,%ecx
  seta   %r8b
  shr    $0x4,%esi
  shr    $0x4,%r10d
  mov    %esi,%ecx
  and    $0x1,%esi
  xor    %r10d,%ecx
  and    $0x1,%r10d
  and    $0x1,%ecx
  xor    %r8d,%ecx
  shl    $0x4,%ecx
  or     %edx,%ecx
  lea    (%rsi,%r10,1),%edx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%edx
  xor    %r8d,%r8d
  cmp    $0x1,%edx
  seta   %r8b
  shr    $0x5,%esi
  shr    $0x5,%r10d
  mov    %esi,%edx
  and    $0x1,%esi
  xor    %r10d,%edx
  and    $0x1,%r10d
  and    $0x1,%edx
  xor    %r8d,%edx
  shl    $0x5,%edx
  or     %ecx,%edx
  lea    (%rsi,%r10,1),%ecx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%ecx
  xor    %r8d,%r8d
  cmp    $0x1,%ecx
  seta   %r8b
  shr    $0x6,%esi
  shr    $0x6,%r10d
  mov    %esi,%ecx
  and    $0x1,%esi
  xor    %r10d,%ecx
  and    $0x1,%r10d
  and    $0x1,%ecx
  xor    %r8d,%ecx
  shl    $0x6,%ecx
  or     %edx,%ecx
  lea    (%rsi,%r10,1),%edx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%edx
  xor    %r8d,%r8d
  cmp    $0x1,%edx
  seta   %r8b
  shr    $0x7,%esi
  shr    $0x7,%r10d
  mov    %esi,%edx
  and    $0x1,%esi
  xor    %r10d,%edx
  and    $0x1,%r10d
  and    $0x1,%edx
  xor    %r8d,%edx
  shl    $0x7,%edx
  or     %ecx,%edx
  lea    (%rsi,%r10,1),%ecx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%ecx
  xor    %r8d,%r8d
  cmp    $0x1,%ecx
  seta   %r8b
  shr    $0x8,%esi
  shr    $0x8,%r10d
  mov    %esi,%ecx
  and    $0x1,%esi
  xor    %r10d,%ecx
  and    $0x1,%r10d
  and    $0x1,%ecx
  xor    %r8d,%ecx
  shl    $0x8,%ecx
  or     %edx,%ecx
  lea    (%rsi,%r10,1),%edx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%edx
  xor    %r8d,%r8d
  cmp    $0x1,%edx
  seta   %r8b
  shr    $0x9,%esi
  shr    $0x9,%r10d
  mov    %esi,%edx
  and    $0x1,%esi
  xor    %r10d,%edx
  and    $0x1,%r10d
  and    $0x1,%edx
  xor    %r8d,%edx
  shl    $0x9,%edx
  or     %ecx,%edx
  lea    (%rsi,%r10,1),%ecx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%ecx
  xor    %r8d,%r8d
  cmp    $0x1,%ecx
  seta   %r8b
  shr    $0xa,%esi
  shr    $0xa,%r10d
  mov    %esi,%ecx
  and    $0x1,%esi
  xor    %r10d,%ecx
  and    $0x1,%r10d
  and    $0x1,%ecx
  xor    %r8d,%ecx
  shl    $0xa,%ecx
  or     %edx,%ecx
  lea    (%rsi,%r10,1),%edx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%edx
  xor    %r8d,%r8d
  cmp    $0x1,%edx
  seta   %r8b
  shr    $0xb,%esi
  shr    $0xb,%r10d
  mov    %esi,%edx
  and    $0x1,%esi
  xor    %r10d,%edx
  and    $0x1,%r10d
  and    $0x1,%edx
  xor    %r8d,%edx
  shl    $0xb,%edx
  or     %ecx,%edx
  lea    (%rsi,%r10,1),%ecx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%ecx
  xor    %r8d,%r8d
  cmp    $0x1,%ecx
  seta   %r8b
  shr    $0xc,%esi
  shr    $0xc,%r10d
  mov    %esi,%ecx
  and    $0x1,%esi
  xor    %r10d,%ecx
  and    $0x1,%r10d
  and    $0x1,%ecx
  xor    %r8d,%ecx
  shl    $0xc,%ecx
  or     %edx,%ecx
  lea    (%rsi,%r10,1),%edx
  mov    %edi,%esi
  mov    %eax,%r10d
  add    %r8d,%edx
  xor    %r8d,%r8d
  cmp    $0x1,%edx
  seta   %r8b
  shr    $0xd,%esi
  shr    $0xd,%r10d
  mov    %esi,%edx
  and    $0x1,%esi
  xor    %r10d,%edx
  and    $0x1,%r10d
  and    $0x1,%edx
  xor    %r8d,%edx
  shl    $0xd,%edx
  or     %ecx,%edx
  lea    (%rsi,%r10,1),%ecx
  mov    %eax,%r10d
  add    %r8d,%ecx
  xor    %r8d,%r8d
  cmp    $0x1,%ecx
  mov    %edi,%ecx
  seta   %r8b
  shr    $0xe,%ecx
  shr    $0xe,%r10d
  mov    %ecx,%esi
  and    $0x1,%ecx
  xor    %r10d,%esi
  and    $0x1,%r10d
  and    $0x1,%esi
  xor    %r8d,%esi
  shl    $0xe,%esi
  or     %edx,%esi
  lea    (%rcx,%r10,1),%edx
  mov    %edi,%ecx
  add    %r8d,%edx
  xor    %r8d,%r8d
  cmp    $0x1,%edx
  seta   %r8b
  shr    $0xf,%ecx
  xor    %r14d,%r14d
  shr    $0xf,%eax
  mov    %ecx,%edx
  and    $0x1,%ecx
  xor    %eax,%edx
  and    $0x1,%eax
  and    $0x1,%edx
  add    %ecx,%eax
  xor    %r8d,%edx
  add    %r8d,%eax
  shl    $0xf,%edx
  or     %esi,%edx
  cmp    $0x1,%eax
  seta   %r14b
  mov    %edx,%r12d
  call   <registerSgn@plt>
  mov    (%rbx),%edi
  mov    %rax,%r15
  call   <registerSgn@plt>
  mov    %rax,%r8
  xor    %eax,%eax
  cmp    %r8,%r15
  je     L15
L28:
  mov    %eax,0x0(%r13)
  mov    (%rsp),%rax
  mov    0x8(%rsp),%rbx
  mov    %r14d,(%rax)
  xor    %eax,%eax
  test   %r12d,%r12d
  sete   %al
  mov    %eax,(%rbx)
  mov    %r12d,0x0(%rbp)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L15:
  mov    0x0(%rbp),%edi
  call   <registerSgn@plt>
  mov    %r12d,%edi
  mov    %rax,%r15
  call   <registerSgn@plt>
  mov    %rax,%r8
  mov    $0x1,%eax
  cmp    %r8,%r15
  jne    L28
  mov    (%rbx),%eax
  xor    0x0(%rbp),%eax
  xor    %r12d,%eax
  shr    $0xf,%eax
  and    $0x1,%eax
  xor    %r14d,%eax
  jmp    L28
```

assistant: ```c
void add_internal(unsigned int *v1, unsigned int *v2, int *carry, int *zero, int *error) {
  unsigned int retenue = 0U;
  unsigned int resultat = 0U;
  unsigned int i;
  for (i = 0U; i < (8U * 2U); ++i) {
    resultat |= ((((1U << i) & *v1) ? 1U : 0U) ^ (((1U << i) & *v2) ? 1U : 0U) ^ retenue) << i;
    retenue = ((((1U << i) & *v1) ? 1U : 0U) + (((1U << i) & *v2) ? 1U : 0U) + retenue) > 1;
  }
  if (registerSgn(*v1) == registerSgn(*v2)) {
    if (registerSgn(*v1) != registerSgn(resultat))
      *error = 1U;
    else {
      unsigned int s;
      s = ((((1U << ((8U * 2U) - 1)) & *v1) ? 1U : 0U) ^ (((1U << ((8U * 2U) - 1)) & *v2) ? 1U : 0U)) != (((1U << ((8U * 2U) - 1)) & resultat) ? 1U : 0U);
      *error = (s != retenue);
    }
  } else
    *error = 0;
  *carry = (int)retenue;
  *zero = resultat == 0U;
  *v1 = resultat;
}
```