user: Demonstrate the C code that generates the assembly output below:

```asm
<union2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0xa8(%rbp)
  mov    %rsi,-0xb0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x98(%rbp)
  movl   $0x0,-0x94(%rbp)
  mov    -0xa8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L8
  mov    -0xb0(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L10
L8:
  mov    $0x0,%eax
  jmp    L135
L61:
  mov    -0x98(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xa8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%ecx
  mov    -0x98(%rbp),%edx
  mov    -0xa8(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <ft_check_char@plt>
  test   %eax,%eax
  jne    L32
  mov    -0x98(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xa8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x94(%rbp),%eax
  cltq
  mov    %dl,-0x90(%rbp,%rax,1)
  addl   $0x1,-0x98(%rbp)
  addl   $0x1,-0x94(%rbp)
  jmp    L10
L32:
  addl   $0x1,-0x98(%rbp)
L10:
  mov    -0x98(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xa8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L61
  movl   $0x0,-0x98(%rbp)
  jmp    L143
L140:
  mov    -0x98(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%ecx
  mov    -0x98(%rbp),%edx
  mov    -0xb0(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <ft_check_char@plt>
  test   %eax,%eax
  jne    L30
  mov    -0x98(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x94(%rbp),%eax
  cltq
  mov    %dl,-0x90(%rbp,%rax,1)
  addl   $0x1,-0x98(%rbp)
  addl   $0x1,-0x94(%rbp)
  jmp    L143
L30:
  addl   $0x1,-0x98(%rbp)
L143:
  mov    -0x98(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L140
  mov    -0x94(%rbp),%eax
  cltq
  movb   $0x0,-0x90(%rbp,%rax,1)
  movl   $0x0,-0x98(%rbp)
  jmp    L111
L54:
  mov    -0x98(%rbp),%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  movsbl %al,%ecx
  mov    -0x98(%rbp),%edx
  lea    -0x90(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <ft_check_char@plt>
  test   %eax,%eax
  jne    L80
  mov    -0x98(%rbp),%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <ft_putchar@plt>
  addl   $0x1,-0x98(%rbp)
  jmp    L111
L80:
  addl   $0x1,-0x98(%rbp)
L111:
  mov    -0x98(%rbp),%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  test   %al,%al
  jne    L54
  mov    $0x0,%eax
L135:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L104
  call   <__stack_chk_fail@plt>
L104:
  leave
  ret
```

assistant: ```c
int union2(char *s1, char *s2) {
  int i;
  char cup[127];
  int j;
  i = 0;
  j = 0;
  if (*s1 == '\0' || *s2 == '\0')
    return (0);
  while (s1[i] != '\0')
    if (!(ft_check_char(s1, s1[i], i))) {
      cup[j] = s1[i];
      i++;
      j++;
    } else
      i++;
  i = 0;
  while (s2[i] != '\0')
    if (!(ft_check_char(s2, s2[i], i))) {
      cup[j] = s2[i];
      i++;
      j++;
    } else
      i++;
  cup[j] = '\0';
  i = 0;
  while (cup[i] != '\0')
    if (!(ft_check_char(cup, cup[i], i))) {
      ft_putchar(cup[i]);
      i++;
    } else
      i++;
  return (0);
}
```