user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<from_vax_float>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1d(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl 0x1(%rax),%eax
  mov    %al,-0x1c(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl 0x2(%rax),%eax
  mov    %al,-0x1b(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl 0x3(%rax),%eax
  mov    %al,-0x1a(%rbp)
  movzbl -0x1c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%edx
  movzbl -0x1d(%rbp),%eax
  shr    $0x7,%al
  or     %edx,%eax
  mov    %al,-0x19(%rbp)
  cmpb   $0x0,-0x19(%rbp)
  jne    L2
  cmpb   $0x0,-0x1c(%rbp)
  jne    L2
  pxor   %xmm0,%xmm0
  jmp    L42
L2:
  cmpb   $0x2,-0x19(%rbp)
  jbe    L70
  movzbl -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  movzbl -0x1d(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  lea    0x2(%rax),%rdx
  movzbl -0x1a(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  lea    0x3(%rax),%rdx
  movzbl -0x1b(%rbp),%eax
  mov    %al,(%rdx)
  jmp    L5
L70:
  cmpb   $0x0,-0x19(%rbp)
  je     L34
  movzbl -0x1c(%rbp),%eax
  and    $0xffffff80,%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
  movzbl -0x19(%rbp),%edx
  mov    $0x3,%eax
  sub    %edx,%eax
  mov    %eax,-0x14(%rbp)
  movzbl -0x1d(%rbp),%eax
  and    $0x7f,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%esi
  movzbl -0x19(%rbp),%eax
  mov    $0x10,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %eax,%esi
  mov    %esi,%edx
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  mov    %dl,(%rax)
  movzbl -0x1d(%rbp),%edx
  mov    $0x8,%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%esi
  movzbl -0x1a(%rbp),%edx
  mov    -0x14(%rbp),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  or     %eax,%esi
  mov    %esi,%edx
  mov    -0x10(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  movzbl -0x1a(%rbp),%edx
  mov    $0x8,%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%esi
  movzbl -0x1b(%rbp),%edx
  mov    -0x14(%rbp),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  or     %eax,%esi
  mov    %esi,%edx
  mov    -0x10(%rbp),%rax
  add    $0x3,%rax
  mov    %dl,(%rax)
  jmp    L5
L34:
  mov    -0x10(%rbp),%rax
  movb   $0xff,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl -0x1d(%rbp),%edx
  or     $0xffffff80,%edx
  mov    %dl,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x2(%rax),%rdx
  movzbl -0x1a(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  lea    0x3(%rax),%rdx
  movzbl -0x1b(%rbp),%eax
  mov    %al,(%rdx)
L5:
  movss  -0x18(%rbp),%xmm0
L42:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L68
  call   <__stack_chk_fail@plt>
L68:
  leave
  ret
```

assistant: ```c
float from_vax_float(unsigned char *inp) {
  unsigned char exp;
  unsigned char c0, c1, c2, c3;
  float o;
  unsigned char *outp;
  outp = (unsigned char *)&o;
  c0 = inp[0];
  c1 = inp[1];
  c2 = inp[2];
  c3 = inp[3];
  exp = (c1 << 1) | (c0 >> 7);
  if (!exp && !c1)
    return (0.0);
  else if (exp > 2) {
    outp[0] = c1 - 1;
    outp[1] = c0;
    outp[2] = c3;
    outp[3] = c2;
  } else if (exp) {
    unsigned int shft;
    outp[0] = c1 & 0x80;
    shft = 3 - exp;
    outp[1] = ((c0 & 0x7f) >> shft) | (0x10 << exp);
    outp[2] = (c0 << (8 - shft)) | (c3 >> shft);
    outp[3] = (c3 << (8 - shft)) | (c2 >> shft);
  } else {
    outp[0] = 0xff;
    outp[1] = c0 | 0x80;
    outp[2] = c3;
    outp[3] = c2;
  }
  return (o);
}
```