user: 这段汇编代码用C语言表示是什么样的?

```asm
<my_strnconcat>:
  endbr64
  push   %r13
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x8,%rsp
  test   %rdi,%rdi
  je     L56
  mov    %rdi,%rbp
  test   %rsi,%rsi
  jne    L260
  test   %rdi,%rdi
  je     L56
  xor    %eax,%eax
  call   <my_strdup@plt>
  movslq %eax,%r8
L153:
  add    $0x8,%rsp
  mov    %r8,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopw   0x0(%rax,%rax,1)
L56:
  xor    %r8d,%r8d
  test   %rbx,%rbx
  je     L153
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <my_strlen@plt>
  cmp    %r12d,%eax
  cmovbe %eax,%r12d
  xor    %eax,%eax
  mov    %r12d,%edi
  add    $0x1,%rdi
  call   <xmalloc@plt>
  movslq %eax,%r8
  test   %r12d,%r12d
  je     L153
  lea    0x1(%rbx),%rsi
  mov    %r8,%rcx
  lea    -0x1(%r12),%edx
  mov    %r8,%rax
  sub    %rsi,%rcx
  cmp    $0xe,%rcx
  jbe    L193
  cmp    $0x6,%edx
  jbe    L193
  cmp    $0xe,%edx
  jbe    L257
  mov    %r12d,%edx
  shr    $0x4,%edx
  sub    $0x1,%edx
  shl    $0x4,%rdx
  lea    0x10(%r8,%rdx,1),%rcx
  mov    %rbx,%rdx
  sub    %r8,%rdx
  nopl   (%rax)
L384:
  movdqu (%rax,%rdx,1),%xmm0
  add    $0x10,%rax
  movups %xmm0,-0x10(%rax)
  cmp    %rcx,%rax
  jne    L384
  mov    %r12d,%edx
  and    $0xfffffff0,%edx
  mov    %edx,%eax
  cmp    %edx,%r12d
  je     L153
  mov    %r12d,%ecx
  sub    %edx,%ecx
  lea    -0x1(%rcx),%esi
  cmp    $0x6,%esi
  jbe    L102
L116:
  mov    (%rbx,%rdx,1),%rsi
  mov    %rsi,(%r8,%rdx,1)
  mov    %ecx,%edx
  and    $0xfffffff8,%edx
  add    %edx,%eax
  cmp    %ecx,%edx
  je     L153
L102:
  movslq %eax,%rdx
  movzbl (%rbx,%rdx,1),%ecx
  mov    %cl,(%r8,%rdx,1)
  lea    0x1(%rax),%edx
  cmp    %edx,%r12d
  jbe    L153
  movslq %edx,%rdx
  movzbl (%rbx,%rdx,1),%ecx
  mov    %cl,(%r8,%rdx,1)
  lea    0x2(%rax),%edx
  cmp    %edx,%r12d
  jbe    L153
  movslq %edx,%rdx
  movzbl (%rbx,%rdx,1),%ecx
  mov    %cl,(%r8,%rdx,1)
  lea    0x3(%rax),%edx
  cmp    %edx,%r12d
  jbe    L153
  movslq %edx,%rdx
  movzbl (%rbx,%rdx,1),%ecx
  mov    %cl,(%r8,%rdx,1)
  lea    0x4(%rax),%edx
  cmp    %edx,%r12d
  jbe    L153
  movslq %edx,%rdx
  movzbl (%rbx,%rdx,1),%ecx
  mov    %cl,(%r8,%rdx,1)
  lea    0x5(%rax),%edx
  cmp    %edx,%r12d
  jbe    L153
  movslq %edx,%rdx
  add    $0x6,%eax
  movzbl (%rbx,%rdx,1),%ecx
  mov    %cl,(%r8,%rdx,1)
  cmp    %eax,%r12d
  jbe    L153
  cltq
  movzbl (%rbx,%rax,1),%edx
  mov    %dl,(%r8,%rax,1)
  add    $0x8,%rsp
  mov    %r8,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L260:
  xor    %eax,%eax
  call   <my_strlen@plt>
  mov    %rbx,%rdi
  mov    %eax,%r13d
  xor    %eax,%eax
  call   <my_strlen@plt>
  cmp    %r12d,%eax
  cmovbe %eax,%r12d
  xor    %eax,%eax
  lea    0x0(%r13,%r12,1),%edi
  add    $0x1,%rdi
  call   <xmalloc@plt>
  movzbl 0x0(%rbp),%ecx
  movslq %eax,%rsi
  mov    %rsi,%r8
  test   %cl,%cl
  je     L70
  mov    $0x1,%eax
  nopw   0x0(%rax,%rax,1)
L336:
  mov    %cl,-0x1(%rax,%rsi,1)
  mov    %eax,%edx
  add    $0x1,%rax
  movzbl -0x1(%rbp,%rax,1),%ecx
  test   %cl,%cl
  jne    L336
L282:
  test   %r12d,%r12d
  je     L153
  movslq %edx,%r9
  lea    0x1(%rbx),%r11
  lea    -0x1(%r12),%edi
  lea    (%rsi,%r9,1),%rcx
  mov    %rcx,%r10
  mov    %rcx,%rax
  sub    %r11,%r10
  cmp    $0xe,%r10
  jbe    L197
  cmp    $0x6,%edi
  jbe    L197
  cmp    $0xe,%edi
  jbe    L245
  mov    %r12d,%edi
  mov    %rbx,%r9
  shr    $0x4,%edi
  sub    %rcx,%r9
  shl    $0x4,%rdi
  add    %rcx,%rdi
  nopl   0x0(%rax)
L269:
  movdqu (%rax,%r9,1),%xmm1
  add    $0x10,%rax
  movups %xmm1,-0x10(%rax)
  cmp    %rdi,%rax
  jne    L269
  mov    %r12d,%eax
  and    $0xfffffff0,%eax
  mov    %eax,%edi
  add    %eax,%edx
  cmp    %eax,%r12d
  je     L153
  mov    %r12d,%r9d
  sub    %eax,%r9d
  lea    -0x1(%r9),%r10d
  cmp    $0x6,%r10d
  jbe    L413
L381:
  mov    (%rbx,%rax,1),%r10
  mov    %r10,(%rcx,%rax,1)
  mov    %r9d,%eax
  and    $0xfffffff8,%eax
  add    %eax,%edx
  add    %eax,%edi
  cmp    %eax,%r9d
  je     L153
L413:
  movslq %edi,%rax
  movzbl (%rbx,%rax,1),%ecx
  movslq %edx,%rax
  mov    %cl,(%rsi,%rax,1)
  lea    0x1(%rdi),%eax
  lea    0x1(%rdx),%ecx
  cmp    %r12d,%eax
  jae    L153
  cltq
  movslq %ecx,%rcx
  movzbl (%rbx,%rax,1),%eax
  mov    %al,(%rsi,%rcx,1)
  lea    0x2(%rdi),%eax
  lea    0x2(%rdx),%ecx
  cmp    %eax,%r12d
  jbe    L153
  cltq
  movslq %ecx,%rcx
  movzbl (%rbx,%rax,1),%eax
  mov    %al,(%rsi,%rcx,1)
  lea    0x3(%rdi),%eax
  lea    0x3(%rdx),%ecx
  cmp    %eax,%r12d
  jbe    L153
  cltq
  movslq %ecx,%rcx
  movzbl (%rbx,%rax,1),%eax
  mov    %al,(%rsi,%rcx,1)
  lea    0x4(%rdi),%eax
  lea    0x4(%rdx),%ecx
  cmp    %eax,%r12d
  jbe    L153
  cltq
  movslq %ecx,%rcx
  movzbl (%rbx,%rax,1),%eax
  mov    %al,(%rsi,%rcx,1)
  lea    0x5(%rdi),%eax
  lea    0x5(%rdx),%ecx
  cmp    %eax,%r12d
  jbe    L153
  cltq
  movslq %ecx,%rcx
  add    $0x6,%edi
  movzbl (%rbx,%rax,1),%eax
  mov    %al,(%rsi,%rcx,1)
  lea    0x6(%rdx),%eax
  cmp    %edi,%r12d
  jbe    L153
  movslq %edi,%rdi
  cltq
  movzbl (%rbx,%rdi,1),%edx
  mov    %dl,(%rsi,%rax,1)
  jmp    L153
  nopl   (%rax)
L193:
  lea    0x1(%r8,%rdx,1),%rcx
  mov    %r8,%rax
  sub    %r8,%rbx
  nopl   0x0(%rax,%rax,1)
L302:
  movzbl (%rbx,%rax,1),%edx
  add    $0x1,%rax
  mov    %dl,-0x1(%rax)
  cmp    %rax,%rcx
  jne    L302
  jmp    L153
L70:
  xor    %edx,%edx
  jmp    L282
  nopl   0x0(%rax)
L197:
  lea    0x1(%rdi,%rsi,1),%rsi
  mov    %rcx,%rax
  sub    %rcx,%rbx
  add    %r9,%rsi
  cs nopw 0x0(%rax,%rax,1)
L314:
  movzbl (%rbx,%rax,1),%edx
  add    $0x1,%rax
  mov    %dl,-0x1(%rax)
  cmp    %rax,%rsi
  jne    L314
  jmp    L153
L257:
  mov    %r12d,%ecx
  xor    %edx,%edx
  xor    %eax,%eax
  jmp    L116
L245:
  mov    %r12d,%r9d
  xor    %eax,%eax
  xor    %edi,%edi
  jmp    L381
```

assistant: ```c
char *my_strnconcat(char *s1, char *s2, unsigned int n) {
  int l1;
  int l2;
  char *s3 = ((void *)0);
  int i;
  int j;
  if (s1 && s2) {
    l1 = my_strlen(s1);
    l2 = my_strlen(s2);
    if (n > l2)
      n = l2;
    s3 = (char *)xmalloc((l1 + n) * sizeof(char) + 1);
    for (i = 0; s1[i]; i++)
      s3[i] = s1[i];
    for (j = 0; j < n; i++, j++)
      s3[i] = s2[j];
    return s3;
  } else if (s1)
    return my_strdup(s1);
  else if (s2) {
    l2 = my_strlen(s2);
    if (n > l2)
      n = l2;
    s3 = xmalloc(n * sizeof(char) + 1);
    for (i = 0; i < n; ++i)
      s3[i] = s2[i];
    return s3;
  } else
    return ((void *)0);
}
```