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

```asm
<import64>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpl   $0x0,-0x20(%rbp)
  je     L47
  cmpl   $0x0,-0x1c(%rbp)
  jne    L45
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  mov    %al,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  mov    %al,-0xf(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  mov    %al,-0xe(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  mov    %al,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  mov    %al,-0xb(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  mov    %al,-0xa(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  jmp    L37
L45:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  mov    %al,-0xf(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  mov    %al,-0xe(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  mov    %al,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  mov    %al,-0xb(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  mov    %al,-0xa(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  jmp    L37
L47:
  cmpl   $0x0,-0x1c(%rbp)
  jne    L46
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  mov    %al,-0xf(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  mov    %al,-0xe(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  mov    %al,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  mov    %al,-0xb(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  mov    %al,-0xa(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  jmp    L37
L46:
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  mov    %al,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  mov    %al,-0xf(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  mov    %al,-0xe(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  mov    %al,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  mov    %al,-0xb(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  mov    %al,-0xa(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
L37:
  movsd  -0x10(%rbp),%xmm0
  movq   %xmm0,%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L26
  call   <__stack_chk_fail@plt>
L26:
  movq   %rax,%xmm0
  leave
  ret
```

assistant: ```c
double import64(char *p, int little_endian, int little_endian_arch) {
  union cvt {
    unsigned char byte[8];
    double double_value;
  } convert;
  if (little_endian_arch) {
    if (!little_endian) {
      convert.byte[0] = *(p + 7);
      convert.byte[1] = *(p + 6);
      convert.byte[2] = *(p + 5);
      convert.byte[3] = *(p + 4);
      convert.byte[4] = *(p + 3);
      convert.byte[5] = *(p + 2);
      convert.byte[6] = *(p + 1);
      convert.byte[7] = *(p + 0);
    } else {
      convert.byte[0] = *(p + 0);
      convert.byte[1] = *(p + 1);
      convert.byte[2] = *(p + 2);
      convert.byte[3] = *(p + 3);
      convert.byte[4] = *(p + 4);
      convert.byte[5] = *(p + 5);
      convert.byte[6] = *(p + 6);
      convert.byte[7] = *(p + 7);
    }
  } else {
    if (!little_endian) {
      convert.byte[0] = *(p + 0);
      convert.byte[1] = *(p + 1);
      convert.byte[2] = *(p + 2);
      convert.byte[3] = *(p + 3);
      convert.byte[4] = *(p + 4);
      convert.byte[5] = *(p + 5);
      convert.byte[6] = *(p + 6);
      convert.byte[7] = *(p + 7);
    } else {
      convert.byte[0] = *(p + 7);
      convert.byte[1] = *(p + 6);
      convert.byte[2] = *(p + 5);
      convert.byte[3] = *(p + 4);
      convert.byte[4] = *(p + 3);
      convert.byte[5] = *(p + 2);
      convert.byte[6] = *(p + 1);
      convert.byte[7] = *(p + 0);
    }
  }
  return convert.double_value;
}
```