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

```asm
<union_uint32_card>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  movq   $0x0,-0x38(%rbp)
  movq   $0x0,-0x30(%rbp)
  movq   $0x0,-0x28(%rbp)
  cmpq   $0x0,-0x60(%rbp)
  jne    L6
  mov    -0x50(%rbp),%rax
  jmp    L66
L6:
  cmpq   $0x0,-0x50(%rbp)
  jne    L147
  mov    -0x60(%rbp),%rax
  jmp    L66
L147:
  mov    -0x30(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x18(%rbp)
L44:
  mov    -0x20(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jge    L89
  addq   $0x1,-0x30(%rbp)
  addq   $0x1,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jae    L45
  mov    -0x30(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  jmp    L44
L89:
  mov    -0x18(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jge    L115
  addq   $0x1,-0x28(%rbp)
  addq   $0x1,-0x38(%rbp)
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L122
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L44
L115:
  addq   $0x1,-0x30(%rbp)
  addq   $0x1,-0x28(%rbp)
  addq   $0x1,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jae    L72
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L72
  mov    -0x30(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L44
L45:
  nop
  jmp    L72
L122:
  nop
L72:
  mov    -0x30(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jae    L167
  mov    -0x50(%rbp),%rax
  sub    -0x30(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  add    %rax,-0x38(%rbp)
  jmp    L41
L167:
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jae    L41
  mov    -0x60(%rbp),%rax
  sub    -0x28(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  add    %rax,-0x38(%rbp)
L41:
  mov    -0x38(%rbp),%rax
L66:
  pop    %rbp
  ret
```

assistant: ```c
size_t union_uint32_card(const uint32_t *set_1, size_t size_1, const uint32_t *set_2, size_t size_2) {
  size_t pos = 0, idx_1 = 0, idx_2 = 0;
  if (0 == size_2) {
    return size_1;
  }
  if (0 == size_1) {
    return size_2;
  }
  uint32_t val_1 = set_1[idx_1], val_2 = set_2[idx_2];
  while (true) {
    if (val_1 < val_2) {
      ++idx_1;
      ++pos;
      if (idx_1 >= size_1)
        break;
      val_1 = set_1[idx_1];
    } else if (val_2 < val_1) {
      ++idx_2;
      ++pos;
      if (idx_2 >= size_2)
        break;
      val_2 = set_2[idx_2];
    } else {
      ++idx_1;
      ++idx_2;
      ++pos;
      if (idx_1 >= size_1 || idx_2 >= size_2)
        break;
      val_1 = set_1[idx_1];
      val_2 = set_2[idx_2];
    }
  }
  if (idx_1 < size_1) {
    const size_t n_elems = size_1 - idx_1;
    pos += n_elems;
  } else if (idx_2 < size_2) {
    const size_t n_elems = size_2 - idx_2;
    pos += n_elems;
  }
  return pos;
}
```