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

```asm
<check_for_hvm>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x1c(%rbp),%rsi
  lea    -0x20(%rbp),%rcx
  lea    -0x24(%rbp),%rdx
  lea    -0x28(%rbp),%rax
  mov    %rsi,%r8
  mov    %rax,%rsi
  mov    $0x40000000,%edi
  call   <cpuid@plt>
  lea    -0x15(%rbp),%rax
  mov    -0x24(%rbp),%edx
  mov    %edx,(%rax)
  lea    -0x15(%rbp),%rax
  add    $0x4,%rax
  mov    -0x20(%rbp),%edx
  mov    %edx,(%rax)
  lea    -0x15(%rbp),%rax
  add    $0x8,%rax
  mov    -0x1c(%rbp),%edx
  mov    %edx,(%rax)
  movb   $0x0,-0x9(%rbp)
  lea    -0x15(%rbp),%rax
  mov    %rax,%rsi
  lea    D80(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L40
  lea    D22(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%eax
  jmp    L71
L40:
  lea    -0x15(%rbp),%rax
  mov    %rax,%rsi
  lea    D33(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L83
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%eax
  jmp    L71
L83:
  lea    -0x15(%rbp),%rax
  mov    %rax,%rsi
  lea    D70(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L0
  lea    D23(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%eax
  jmp    L71
L0:
  lea    -0x15(%rbp),%rax
  mov    %rax,%rsi
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L66
  lea    D48(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%eax
  jmp    L71
L66:
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
L71:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L19
  call   <__stack_chk_fail@plt>
L19:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D80
data_type: string
name: disassemble_data
arguments: data_label: D22
data_type: string
name: disassemble_data
arguments: data_label: D33
data_type: string
name: disassemble_data
arguments: data_label: D20
data_type: string
name: disassemble_data
arguments: data_label: D70
data_type: string
name: disassemble_data
arguments: data_label: D23
data_type: string
name: disassemble_data
arguments: data_label: D8
data_type: string
name: disassemble_data
arguments: data_label: D48
data_type: string
name: disassemble_data
arguments: data_label: D34
data_type: string

tool: D80: KVMKVMKVM

tool: D22: KVM guest.


tool: D33: XenVMMXenVMM

tool: D20: Xen HVM guest.


tool: D70: Microsoft Hv

tool: D23: Microsoft Hv guest.


tool: D8: VMwareVMware

tool: D48: VMWare guest.


tool: D34: No KVM or Xen HVM


assistant: ```c
int check_for_hvm(void) {
  uint32_t eax, ebx, ecx, edx;
  char signature[13];
  cpuid(0x40000000, &eax, &ebx, &ecx, &edx);
  *(uint32_t *)(signature + 0) = ebx;
  *(uint32_t *)(signature + 4) = ecx;
  *(uint32_t *)(signature + 8) = edx;
  signature[12] = '\0';
  if (!strcmp("KVMKVMKVM", signature)) {
    printf("KVM guest.\n");
    return 1;
  } else if (!strcmp("XenVMMXenVMM", signature)) {
    printf("Xen HVM guest.\n");
    return 1;
  } else if (!strcmp("Microsoft Hv", signature)) {
    printf("Microsoft Hv guest.\n");
    return 1;
  } else if (!strcmp("VMwareVMware", signature)) {
    printf("VMWare guest.\n");
    return 1;
  } else {
    printf("No KVM or Xen HVM\n");
    return 0;
  }
  return 0;
}
```